如何使包装类将其构造函数参数转发给std :: vector构造函数?

时间:2013-12-18 13:25:13

标签: c++ vector variadic-templates forwarding function-templates

我有一个wrapper类来包装std::vector<int>数据成员。我希望wrapper的构造函数将其参数转发给vector<int>的ctor。我尝试使用可变参数模板构造函数来实现它。由于std::vector<int> v{1, 2, 3}是由std::initializer_list ctor构建的,所以当我这样做时,我希望wrapper激活vector的{​​{1}} ctor

initializer_list

但我没有得到理想的结果:

wrapper mywrap{1, 2, 3}

输出显示:

#include <iostream> #include <vector> struct wrapper { std::vector<int> v; template <typename ...Tn> wrapper(Tn ...args) : v(args...) {} }; int main() { //----Output---- wrapper wrap1{ 1 }; std::cout << wrap1.v.size() << std::endl; // 1 std::cout << wrap1.v.at(0) << std::endl; // 0 wrapper wrap2{ 1, 2 }; std::cout << wrap2.v.size() << std::endl; // 1 std::cout << wrap2.v.at(0) << std::endl; // 2 wrapper wrap3{ 1, 2, 3 }; // error wrapper wrap4{ std::initializer_list<int>{ 1, 2, 3 } }; // OK } 来电wrapper wrap1{ 1 };

explicit vector (size_type n);来电

wrapper wrap2{ 1, 2 };

vector (size_type n, const value_type& val, const allocator_type& alloc = allocator_type());在未指定wrapper wrap3时失败。

在所有情况下,我都希望激活initializer_list<int>的{​​{1}} ctor。如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

()初始化和{}初始化之间存在差异,在构造函数中,您还应该使用{}初始化。

template <typename ...Tn> wrapper(Tn ...args) : v{args...} {}

顺便说一句,如果你只想要initializer_list c-tor,为什么不简单地写这个c-tor?

wrapper(std::initializer_list<int> args) : v(args) {}