我正在尝试做这样的事情:
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方法来确保首选默认构造函数。