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



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

CCD_ 10。

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

#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
}

输出显示:

CCD_ 11调用CCD_。

wrapper wrap2{ 1, 2 };调用

vector (size_type n, const value_type& val, const allocator_type& alloc = allocator_type());

未指定initializer_list<int>时,wrapper wrap3失败。

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新