【问题标题】:C++ iterator to initialize collections of objects with no default constructor用于初始化没有默认构造函数的对象集合的 C++ 迭代器
【发布时间】:2020-06-20 20:31:52
【问题描述】:

我有一个类Foo 没有合理的默认构造函数。我还希望将复制分配运算符保密,尽管这可能变得不可能。 (我想通过拥有const 字段和少量将 const 方式转换为私有且在对象生命周期早期的变异器,使类“几乎”不可变,从而实现线程安全。)

在这些限制下创建std::vector<Foo> 有点挑战。我想出了一个我在其他地方没有见过的解决方案(例如,参见之前的 SO 问题 1)。我有一个自定义迭代器,在取消引用时会创建一个Foo。它的设置使得每次调用都递增到向量中的下一个值Foo。序列很容易定义。我在CustomIterator 上定义了operator++nextadvancedistanceoperator*

那我有

std::vector<Foo> foo_vec{CustomIterator(0), CustomIterator(size_of_vector)};

没有访问问题。没有不必要的结构。没有副本。有人发现这有问题吗?

【问题讨论】:

  • 这看起来很酷,但为什么呢?只需在您的类中创建一个静态方法,该方法将返回初始化对象的向量。
  • 类中的静态方法如何创建要返回的向量? (这解决了 operator= 问题,并且可能在其他地方有用。)
  • Factory pattern 是你的朋友。
  • 你不能把元素emplace_back放到向量中吗?这只需要复制或移动构造函数,不需要复制或移动赋值运算符。
  • @Brian 是的,我可以有一个空向量,然后在循环中使用emplace_back 对其进行初始化。

标签: c++ collections default-constructor


【解决方案1】:

我会总结一下cmets。简单工厂生成初始化元素的向量。

#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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多