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

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

我有一个wrapper包装 std::vector<int> 的类数据成员。我想要wrapper的构造函数将其参数转发到 vector<int>的 Actor 。我尝试使用可变模板构造函数来实现这一点。自 std::vector<int> v{1, 2, 3}由其 std::initializer_list 构建医生,我想要wrapper激活vectorinitializer_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 wrap3initializer_list<int> 时失败未指定。

在所有情况下,我都想要 vectorinitializer_list<int>要激活的ctor。如何解决这个问题?

最佳答案

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

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

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

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

关于c++ - 如何使包装类将其构造函数参数转发给 std::vector 的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20659444/

相关文章:

c++ - 如何将 vector 传递给 execvp

c++ - N维 vector 的递归可变参数模板函数

c++ - 类型删除和可变参数模板化成员函数

c++ - 如何使用可变参数模板实现折叠

c++ - PhysX 中的时间步长

c++ - 没有 getline 的重载函数实例

java - 如何在 Java 中获取 vector <String> 数组作为返回值?

c++ - 如何删除 typename 中每个元素的 const ref 修饰符... T

c++ - 如何创建对数组和 boost::array 的引用(或不必创建的想法)?

C++如何输出\"\"'(这5个字符)