在基础构造函数中初始化唯一指针的标准容器

时间:2015-07-08 13:34:56

标签: c++ c++11 constructor containers unique-ptr

如果容器及其内容在编译时是已知的,那么在基本构造函数中初始化标准库容器的唯一指针的首选方法是什么? C ++不允许初始化程序列表与唯一指针一起使用,因为它们强制执行复制操作,因此我目前正在使用丑陋的lambda解决方法:

#include <memory>
#include <vector>
#include <string>
using namespace std; // Note: for readability only

// Some non-POD object
class Object {
public: 
    Object(const string& desc) : description(desc) { }
    string description;
    void func () { /* do stuff */ }
};

// This class stores a vector of unique pointers to objects
class BaseX {
public:
    const vector< unique_ptr<const Object> > objects;
    BaseX (vector< unique_ptr<Object> > vec) : 
        objects { make_move_iterator(vec.begin()), make_move_iterator(vec.end()) } { }
};

// This class is a special case of BaseX where the object definitions are constant, and known at compile time (static).
// Question is how to initialize them...
class DerivedX : public BaseX {
public:
    DerivedX () : BaseX(
        // Using a lambda function is a messy idea, but works
        []()->vector< unique_ptr<Object> > {
            unique_ptr<Object> objects[] = {
                make_unique<Object>("My object")
            };
            return { make_move_iterator(begin(objects)), make_move_iterator(end(objects)) };
        }()
    ) { }
};

这似乎应该使用static某个东西,但不确定它适合的位置......

1 个答案:

答案 0 :(得分:2)

我可能只会这样做:

class DerivedX : public BaseX {
public:
  DerivedX () : BaseX(make_vec()) { }

private:
  static auto make_vec()
  {
    std::vector<std::unique_ptr<const O>> v(2);
    v[0] = std::make_unique<O>("1");
    v[1] = std::make_unique<O>("2");
    return v;
  }
};

(使用auto返回类型,因为如果你有make_unique,你似乎正在使用C ++ 14,如果你使用的是C ++ 11,那么只需明确拼写返回类型。 )