2

我有一个wrapper类来包装std::vector<int>数据成员。我希望wrapper' 的构造函数将其参数转发给vector<int>' ctor。我尝试使用可变参数模板构造函数来实现这一点。由于std::vector<int> v{1, 2, 3}是由它的std::initializer_listctor 构造的,所以我想在我做的时候wrapper激活ctorvectorinitializer_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>

在所有情况下,我都希望激活vector's ctor。initializer_list<int>如何解决这个问题?

4

1 回答 1

5

()初始化 by和初始化 by之间的区别{},在您的构造函数中,您还应该使用{}初始化。

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

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

wrapper(std::initializer_list<int> args) : v(args) {}
于 2013-12-18T13:29:51.017 回答