在基本构造函数中初始化唯一指针的标准容器
Initialize standard container of unique pointers in base constructor
假设容器及其内容在编译时已知,在基本构造函数中初始化唯一指针的标准库容器的首选方法是什么? 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
return 类型,因为如果你有 make_unique
,你似乎在使用 C++14,如果你使用 C++11,那么只需拼写return 明确输入。)
假设容器及其内容在编译时已知,在基本构造函数中初始化唯一指针的标准库容器的首选方法是什么? 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
return 类型,因为如果你有 make_unique
,你似乎在使用 C++14,如果你使用 C++11,那么只需拼写return 明确输入。)