我可以从实例列表中初始化std :: vector <T *>吗?

qua*_*ana 5 c++

我有一些这样的对象:

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)

Jar*_*d42 9

使用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;,这也简化了构造函数。

  • 我没有投票,但是我至少警告说,一直引用通过引用传递给构造函数的对象是不合常规的(除了显而易见的类型,例如reference_wrapper本身)。 (2认同)

Bar*_*rry 5

您可以这样进行:

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)