【发布时间】:2014-09-19 19:06:43
【问题描述】:
我想定义可用于任意类型的自定义常量(例如float、double 等)。例如,假设我希望定义一个值为 pi 的常量。
显而易见的解决方案是使用#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。
有没有更好的方法来做到这一点?
【问题讨论】:
标签: c++ templates namespaces constants