我希望有一个这样的类:
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 arguments"C2440
:”正在初始化,无法从初始化器列表转换为容器,没有构造函数可以采用源类型,或者构造函数重载解析不明确。“https://stackoverflow.com/questions/56311239
复制相似问题