Я пытаюсь кратко определить шаблон переменной с этими эффективными значениями:
// (template<typename T> constexpr T EXP = std::numeric_limits<T>::max_exponent / 2;)
// float and double scalar definitions:
const double huge = std::scalbn(1, EXP<double>);
const float huge = std::scalbn(1, EXP<float>);
// SIMD vector definitions:
const Vec8f huge = Vec8f(huge<float>); // vector of 8 floats
const Vec8d huge = Vec8d(huge<double>); // vector of 8 doubles
const Vec4f huge = Vec4f(huge<float>); // vector of 4 floats
// Integral types should fail to compile
Для определения вектора VecXX (векторы SIMD) необходимо использовать соответствующий скалярный тип, как показано (например, huge<float>
длявектор float
с).Это доступно как VecXX::value_type
или через класс шаблона типа черты типа (VectorTraits<VecXX>::value_type
).
В идеале я думаю, что у меня будет что-то вроде:
// Primary. What should go here? I want all other types to not compile
template<typename T, typename Enabler = void>
const T huge = T{ 0 };
// Scalar specialization for floating point types:
template<typename T>
const T huge<T> = std::enable_if_t<std::is_floating_point<T>::value, T>(std::scalbn(1, EXP<T>));
// Vector specialization, uses above declaration for corresponding FP type
template<typename T>
const T huge<T> = std::enable_if_t<VectorTraits<T>::is_vector, T>(huge<VectorTraits<T>::scalar_type>);
, но я могуне совсем определиться с рабочей версией (выше не удается с "переопределением const T huge<T>
").Какой лучший способ сделать это?