我正在尝试做这样的事情:

struct Foo {
    int _val;
    Foo(int v) : _val(v){}
};

struct Bar {
    const std::string &_name;
    Bar(const std::string &name) : _name(name) {}
};

template<typename T>
struct Universal {
    T _t;
    Universal(...) : _t(...) {}
};

// I want to use Universal for Foo abd Bar in the same way:
Universal<Foo> UF(9);       // 9 is for Foo
Universal<Bar> UB("hello"); // "hello" is for bar

在上面的代码中,我想将Universal构造函数中的所有参数转发给T的构造函数。

我该怎么办?

最佳答案

您需要使Universal构造函数成为可变参数模板,并使用参数包和完美的转发。

template<typename T>
struct Universal {
    T _t;

    template <typename... Args>
    Universal(Args&&... args) : _t(std::forward<Args>(args)...) {}
};

不幸的是,正如AndyG在评论中指出的那样,这意味着,如果您尝试复制非const Universal对象,则首选转发版本-因此,您需要显式的const和非const复制构造函数!
template<typename T>
struct Universal {
    T _t;

    template <typename... Args>
    Universal(Args&&... args) : _t(std::forward<Args>(args)...) {}

    Universal(const Universal& rhs): _t(rhs._t) {}
    Universal(      Universal& rhs): _r(rhs._t) {}

    // ... but not move constructors.
};

或使用this answer中显示的SFINAE方法来确保首选默认构造函数。

09-26 20:22