Учитывая следующий векторный класс (предназначенный для 2d, 3d или 4d векторной математики), который использует std :: array, можно ли определить конструктор вариаций и/или конструктор преобразования?Преобразователь/конструктор, определенный пользователем Variadic
В качестве последующего вопроса, это такая плохая практика? Мне нужно, чтобы конвертировать в-целое число, float и double довольно много.
Я знаю, что неявные преобразования произойдут, но мой компилятор даст мне предупреждения об этом (я не хочу их вообще отключать).
#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