我想定义可以用于任意类型的自定义常量(例如float
,double
等)。作为一个例子,假设我想定义一个常量,其值为pi。没有C++ 14的定义模板常量的正确方法?
明显的解决方案是使用#define pi 3.14159265359
,但然后pi
不会在名称空间中,我冒着名称冲突的风险。我没有使用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
。
有没有更好的方法来做到这一点?
对于我打算使用这些常量而言,这有点矫枉过正,但对于超出范围而言是+1。 – Null 2014-09-19 19:46:55
@Null没有像过度工程这样的杀戮。 – Yakk 2014-09-19 19:55:18