模板化代码的高精度常数

时间:2010-04-13 22:33:57

标签: c++

我正在编写一个模板类,它采用类似浮点类型(float,double,decimal,GMP)作为参数。但是,我的类需要各种数字常量。其中一些是有理数(int / int),而另一些是非理性的,可用于30个左右的小数位。

初始化这些常量的最佳方法是:

T c1 = <constant>;

其中T是模板类型?

虽然我总是可以回退双打(T c1 = 0.1415926535 ......)并依靠编译器/隐式初始化器转换为适当的类型,但如果可能的话,我希望保留额外的精度。

我对当前的解决方案和那些C ++ 0x(或者是C ++ 1x?)可能带来的解决方案感兴趣。

2 个答案:

答案 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>();