gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:30 26 4
gpt4 key购买 nike

我有一个 wrapper包装 std::vector<int> 的类数据成员。我想要 wrapper的构造函数将其参数转发给 vector<int>的ctor。我尝试使用可变参数模板构造函数来实现它。自 std::vector<int> v{1, 2, 3}由其 std::initializer_list 构建ctor,我想要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 wrap3 initializer_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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com