我有一些这样的对象:
Obj o1{};
Obj o2{};
Obj o3{};
...
Run Code Online (Sandbox Code Playgroud)
但是,我还有另一个班级Foo,其中有一个std::vector<Obj*>作为成员。
如何vector从任意列表初始化?
我想这样构造Foo:
Foo f{o1, o3, o4};
Run Code Online (Sandbox Code Playgroud)
我已经知道我没有参考资料的集合,因此尝试了此操作。
class Foo {
public:
explicit Foo(std::initializer_list<Obj&> px) {
for (auto& p : px) {
fwds.push_back(&p);
}
}
...
private:
std::vector<Obj*> fwds;
};
Run Code Online (Sandbox Code Playgroud)
我在这种情况下得到的错误是:
... include\initializer_list(25,1): error C2528: 'abstract declarator': pointer to reference is illegal
Run Code Online (Sandbox Code Playgroud)
使用std::reference_wrapper,您可以执行以下操作:
explicit Foo(std::initializer_list<std::reference_wrapper<Obj>> px) {
for (auto& p : px) {
fwds.push_back(&p.get());
}
}
Run Code Online (Sandbox Code Playgroud)
注意:您可能还想将成员提升为std::vector<std::reference_wrapper<Obj>> fwds;,这也简化了构造函数。
您可以这样进行:
class Foo {
public:
template <typename... Objs,
std::enable_if_t<(std::is_base_of_v<Obj, Objs> && ...), int> = 0>
explicit Foo(Objs&... o)
: fwds{&o...}
{ }
private:
std::vector<Obj*> fwds;
};
Run Code Online (Sandbox Code Playgroud)
在C ++ 20中变为:
class Foo {
public:
explicit Foo(std::derived_from<Obj> auto&... o)
: fwds{&o...}
{ }
private:
std::vector<Obj*> fwds;
};
Run Code Online (Sandbox Code Playgroud)