以下是扩展版,效果很好,只是我想使用初始化列表
vector<shared_ptr<Foo>> inputs = {
make_shared<Foo>("foo"),
make_shared<Foo>("bar"),
make_shared<Foo>("baz")
};
所以我试过类似的东西
vector<shared_ptr<Foo>> inputs2 = {
{ "foo" },
{ "bar" },
{ "baz" }
};
还有两个括号,或者没有,即 {{ "foo"}}
和只是 "foo"
。
std::shared_ptr<Foo> foo = { "foo" };
也不编译,所以我认为这根本不是 vector 的问题,而是用初始化列表初始化 shared_ptrs。
最佳答案
唯一合理的版本是您建议的第一个版本。
如果您查看 std::shared_ptr documentation ,您将看到没有构造函数将托管对象构造函数参数作为可变参数模板。这意味着您不会找到类似以下内容的内容:
template<class T,class... Arg>
std::shared_ptr<T>::shared_ptr(Args&&... args)
所以你真的不能做类似的事情
std::shared_ptr<std::string> p("hi there");
这是行不通的。
您可以为 std::shared_ptr
做什么用 T*
构造它,所以这应该有效:
std::shared_ptr<std::string> p(new std::string("hi"));
现在,您可能会想,“嘿!我可以在初始化列表中使用它!”但不,这个:
std::initializer_list<std::shared_ptr<std::string>> il{
new std::string("hi there"),
new std::string("hi there")
};
将不起作用,因为该特定构造函数具有 explicit
关键字,因此必须明确声明!
所以最终,你可以写出类似
的东西std::initializer_list<std::shared_ptr<std::string>> il{
std::shared_ptr<std::string>(new std::string("hi there"))
};
但正如您自己所见,您的第一次尝试要简单得多,时间也短得多。
总结:鉴于没有shared_ptr
的事实将参数传递给托管对象构造函数的构造函数,你不能真正使用 {args...}
作为有效语法。鉴于 shared_ptr
得到T*
必须明确声明,你不能做类似 {new T(args..)}
的事情, 所以最简单的方法是使用 std::make_shared
.
附言在您的第一个片段中,用于初始化 vector 的东西 是 初始化列表。除了它的类型是 std::initializer_list<std::shared_ptr<Foo>>
而不是 std::initializer_list<Foo>
就像第二个片段。
关于c++ - 如何为采用一个参数的类初始化 shared_ptr vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32940308/