我有一个没有明智的默认构造函数的类Foo
。我也希望保留副本分配运算符的私有性,尽管这可能变得不可能。 (我想通过具有const
字段和少数将const方式转换为私有且在对象生命周期早期的变种器,使该类“几乎”不变,从而使线程安全。)
在这些约束下创建std::vector<Foo>
有点挑战。我想出了一个其他地方都没有见过的解决方案(例如,参见前面的SO问题1)。我有一个自定义迭代器,当取消引用时,它将创建一个Foo
。设置时,每次调用将递增到向量中的下一个Foo
值。顺序很容易定义。我在operator++
上定义了next
,advance
,distance
,operator*
和CustomIterator
。
然后我有
std::vector<Foo> foo_vec{CustomIterator(0), CustomIterator(size_of_vector)};
没有访问问题。没有不必要的结构。没有副本。有人看到这个问题吗?
#include <vector>
class X {
explicit X(int value) : value_(value) {}
X& operator=(const X&) = default;
friend std::vector<X> generate(int from, int to);
public:
const int value_;
};
// simplest factory ever
std::vector<X> generate(int from, int to) {
std::vector<X> result;
result.reserve(to - from);
for (int k = from; k < to; ++k) {
result.emplace_back(std::move(X(k)));
}
return std::vector<X>();
}
int main() {
auto v = generate(0, 10);
static_cast<void>(v);
}