我想定义可用于任意类型的自定义常量(例如 float
、 double
等)。例如,假设我想定义一个值为 pi 的常量。
显而易见的解决方案是使用 #define pi 3.14159265359
,然后 pi
不会在 namespace 中,我冒着名称冲突的风险。我没有使用 C++14,所以我不能使用 variable template .我能想到的最好的方法如下:
#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;
}
我现在可以在命名空间中定义这些常量,并且可以根据需要使用任意(数字)类型。然而,这至少有两个不受欢迎的特点:
- 它需要一个不需要的函数调用(它只是一个常量!)。
- 我必须在函数调用中指定类型,即使函数返回的是已知类型的变量。例如,在上面的代码中我必须使用
pitest = constants::pi<float>();
而不是简单地pitest = constants::pi();
尽管pitest
显然是float
.
有更好的方法吗?
最佳答案
为什么不使用自动转换为任何类型的特殊对象?
static struct {
template<class T> operator T() const constexpr
{ return (T)3.14159265359; }
} pi;
您甚至可以为更大的类型、任意精度算术、公式系统等添加特化。
关于c++ - 在没有 C++14 的情况下定义模板常量的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25940793/