【发布时间】:2016-02-08 02:05:22
【问题描述】:
给定以下使用 std::array 的向量类(用于 2d、3d 或 4d 向量数学),是否可以定义可变参数构造函数和/或转换构造函数?
作为后续问题,这种事情是不好的做法吗?我发现自己需要大量转换整数、浮点数和双精度数。
我知道会发生隐式转换,但我的编译器会对此发出警告(我一般不想关闭它们)。
#include <array>
template<typename T0, size_t S>
class Vec
{
public:
static_assert(S > 1 && S < 5, "vector dimension must be between 2 and 4");
static_assert(std::is_arithmetic<T0>::value, "type must be arithmetic");
std::array<T0, S> v;
Vec() = default;
template<class T1, class T2>
Vec(T1 t1, T2 t2) : v({ static_cast<T0>(t1),
static_cast<T0>(t2) }) {}
template<class T1, class T2, class T3>
Vec(T1 t1, T2 t2, T3 t3) : v({ static_cast<T0>(t1),
static_cast<T0>(t2),
static_cast<T0>(t3) }) {}
template<class T1, class T2, class T3, class T4>
Vec(T1 t1, T2 t2, T3 t3, T4 t4) : v({ static_cast<T0>(t1),
static_cast<T0>(t2),
static_cast<T0>(t3),
static_cast<T0>(t4) }) {}
};
int main(void)
{
auto foo1 = Vec<float, 2>(1, 2);
auto foo2 = Vec<float, 2>(1.0f, 2.0f);
auto foo3 = Vec<float, 2>(1.0, 2.0);
auto foo4 = Vec<float, 2>(1u, 2u);
return 0;
}
【问题讨论】:
-
您关于模板参数 S 的静态断言似乎很奇怪。如果它必须大于 1 且小于 3,那么你也可以说它必须是 2。
-
谢谢。修复。 2、3 或 4。
标签: c++ templates c++11 constructor type-conversion