假设在编译时知道容器及其内容,则在基本构造函数中初始化唯一指针的标准库容器的首选方法是什么? 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某些内容,但不确定其适合的位置...

最佳答案

我可能会做:

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,则只需明确地将返回类型拼写出来。)

关于c++ - 在基本构造函数中初始化唯一指针的标准容器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31294357/

10-11 16:08