变量模板可以推断类型吗?
Can variable templates infer type?
c++14 introduced variable templates 所以我可以这样做:
template <typename T>
const auto PI = std::acos(static_cast<T>(-1));
现在,在使用这个变量的时候可以推导出类型吗?例如:
const auto TWO_PI = 2.0F * PI;
这里我希望 PI<float>
似乎编译器应该能够推断出这一点。为什么编译器 select 不适合我?
不,这不可能。*
*有一个丑陋的选择,但我建议不要使用它:
template <typename T> const auto pi = std::acos(static_cast<T>(-1));
struct auto_pi_t {} auto_pi;
template <typename T> auto operator+(T a, auto_pi_t)
{return a + pi<std::conditional_t<std::is_floating_point_v<T>, T, double>>;}
template <typename T> auto operator+(auto_pi_t, T a)
{return pi<std::conditional_t<std::is_floating_point_v<T>, T, double>> + a;}
// For similar overloads for all plausible operators.
c++14 introduced variable templates 所以我可以这样做:
template <typename T>
const auto PI = std::acos(static_cast<T>(-1));
现在,在使用这个变量的时候可以推导出类型吗?例如:
const auto TWO_PI = 2.0F * PI;
这里我希望 PI<float>
似乎编译器应该能够推断出这一点。为什么编译器 select 不适合我?
不,这不可能。*
*有一个丑陋的选择,但我建议不要使用它:
template <typename T> const auto pi = std::acos(static_cast<T>(-1));
struct auto_pi_t {} auto_pi;
template <typename T> auto operator+(T a, auto_pi_t)
{return a + pi<std::conditional_t<std::is_floating_point_v<T>, T, double>>;}
template <typename T> auto operator+(auto_pi_t, T a)
{return pi<std::conditional_t<std::is_floating_point_v<T>, T, double>> + a;}
// For similar overloads for all plausible operators.