给定以下矢量类(用于2d,3d或4d矢量数学),它使用std :: array,是否可以定义可变参数和/或转换构造函数?可变的用户定义的转换/构造函数
作为后续的问题,这种事情是不好的做法?我发现自己需要转换为整数,浮点数和双精度。
我知道隐式转换会发生,但我的编译器会给我警告(我不想一般关闭它们)。
#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. – antred
谢谢。修复。 2,3或4. – Robinson