我正在编写一个模板类,它采用类似浮点类型(float,double,decimal,GMP)作为参数。但是,我的类需要各种数字常量。其中一些是有理数(int / int),而另一些是非理性的,可用于30个左右的小数位。
初始化这些常量的最佳方法是:
T c1 = <constant>;
其中T是模板类型?
虽然我总是可以回退双打(T c1 = 0.1415926535 ......)并依靠编译器/隐式初始化器转换为适当的类型,但如果可能的话,我希望保留额外的精度。
我对当前的解决方案和那些C ++ 0x(或者是C ++ 1x?)可能带来的解决方案感兴趣。
答案 0 :(得分:2)
我认为最简单的方法是创建一个包含常量的专用容器类,如下所示:
template<class T>
class Constants
{
public:
static const T pi = T(3.1415);
};
//Example specialization:
template<>
class Constants<double>
{
public:
static const double pi = 3.1415926535897932384626433832795;
};
在真正的课堂上,你可以这样做:
const T c1 = Constants<T>::pi;
这样可以避免必须编写完整的特化类来重新定义这些常量。
请注意,默认行为可以回退到隐式双重赋值。
答案 1 :(得分:0)
只是想法,我会为每个特殊常量重载类型:
template<typename T>
struct PI { operator double() { return 3.145243; }
template<>
struct PI<float> { operator float() { return 3.14f; }
template<>
struct PI<int> { operator int() { return 3; }
...
然后使用
T result = 2*PI<T>();