没有C++ 14定义模板化常量的正确方法?

Nul*_*ull 0 c++ templates namespaces const constants

我想限定它可用于任意类型(例如自定义常量float,double等).例如,假设我希望定义一个值为pi的常量.

显而易见的解决方案是使用#define pi 3.14159265359,但后来pi不会在命名空间中,我冒着名称冲突的风险.我没有使用C++ 14所以我不能使用变量模板.我能想到这样做的最好方法如下:

#include <iostream>

using namespace std;

namespace constants {
    template<typename T> T pi() {
        return 3.14159265359;
    }
}

int main() {
    float pitest = 0;
    pitest = constants::pi<float>();
    cout << pitest << endl;
    cout << constants::pi<long double>() << endl;
    cout << constants::pi<int>() << endl;

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我现在可以在命名空间中定义这些常量,我可以根据需要使用任意(数字)类型.但是,至少有两个不良特征:

  1. 它需要一个函数调用,这不是必需的(它只是一个常数!).
  2. 我必须在函数调用中指定类型,即使函数返回已知类型的变量.例如,在上面的代码中,我必须使用pitest = constants::pi<float>();而不是简单,pitest = constants::pi();即使pitest显然是一个float.

有一个更好的方法吗?

Ded*_*tor 6

为什么不使用自动转换为任何类型的特殊对象?

static struct {
    template<class T> operator T() const constexpr
    { return (T)3.14159265359; }
} pi;
Run Code Online (Sandbox Code Playgroud)

您甚至可以为更大的类型,任意精度算术,公式系统等添加特化.