【发布时间】:2019-05-26 06:35:21
【问题描述】:
我想要这样的课程:
template<typename T>
struct Foo {
T* data_;
template<typename... Ts, std::enable_if<std::is_same<T,Ts>...>...>
explicit Foo(Ts...ts) : data_{ ts... } {}
};
但是;语法有问题,我不确定你是否可以在初始化时像这样直接将参数设置为指针。
我想做的就是这样:
Foo<int> f1{ 1, 3, 5, 7 }; // Or
// Foo<int> f1( 1, 3, 5 7 );
// f1.data_[0] = 1
// f1.data_[1] = 3
// f1.data_[2] = 5
// f1.data_[3] = 7
// f1.data_[4] = ... not our memory either garbage or undefined...
Foo<float> f2{ 3.5f, 7.2f, 9.8f }; // Or
// Foo<float> f2( 3.5f, 7.2f, 9.8f );
// f2.data_[0] = 3.5
// f2.data_[1] = 7.2
// f2.data_[2] = 9.8
// f2.data_[3] = ... not our memory
我还想让构造函数检查以确保传递给构造函数的每个参数都是<T> 类型;简单地说,每个Ts 必须是T。
我可能想多了,但对于我的生活,我无法得到这个或类似的东西来编译。我不知道它是在enable_if、is_same 内还是通过类的初始化列表并试图将内容存储到指针中。我不知道我是否应该改用 T 的数组,但是在将参数传递给构造函数之前不会知道数组的大小。我也在尝试在不使用std::vector 等基本容器的情况下执行此操作;它更多的是用于自学而不是实用的源代码。我只是想看看如何使用原始指针来完成。
编辑
我已经把我的班级改成这样了:
template<typename T>
struct Foo {
T* data_;
template<typename... Ts, std::enable_if_t<std::is_same<T, Ts...>::value>* = nullptr>
explicit Foo( const Ts&&... ts ) : data_{ std::move(ts)... } {}
};
当尝试使用它时:
int a = 1, b = 3, c = 5, d = 7;
Foo<int> f1( a, b, c, d );
Foo<int> f2{ a, b, c, d };
我对这次迭代更近了一点;但它们都给出了不同的编译器错误。
- 第一个是:
C2661:“没有重载函数需要 4 个参数” - 第二个:
C2440:“正在初始化,无法从初始化列表转换为容器,没有构造函数可以采用源类型,或者构造函数重载决议不明确。”
【问题讨论】:
标签: c++ templates c++17 variadic-functions enable-if