如何将浮点值用作非类型模板参数?

时间:2010-11-03 09:11:43

标签: c++ templates c++11

是否有任何理由不能将double作为带模板的参数类型?
例如:

template<int N>//-< Legal
struct
{
};  

template<double N>//-< Illegal
struct
{
};  

C ++ 11中是否有更新?

3 个答案:

答案 0 :(得分:5)

鉴于浮点算术仅提供模糊结果(sqrt(2.0)*sqrt(2.0)可能不等于2.0),您如何建议使用double作为模板参数可能有用?如果您有模板

template<double D>  // not allowed in C++
class X {};

并专注于

template<>
class X<2.0> {};

然后

X<1.0+1.0> x;

可能不会指专业化。

我会说这严重限制了它的用处,我称之为残废。

答案 1 :(得分:5)

这与精度有关,浮点数无法精确表示,并且您引用相同类型的可能性取决于数字的表示方式。请考虑使用整数尾数和指数作为模板参数......

答案 2 :(得分:2)

你只能对模板参数使用整数类型,但你可以通过使用两个整数来欺骗你的方式使用小数值,一个作为尾数,一个作为指数,一个作为分子,一个作为分母。使用巧妙的元编程技术,您甚至可以将它们降低到最低的条件,因此如果您使用有理数,则X&lt; 3,6&gt;将与X&lt; 1,2&gt;

一样工作

你可以做什么以及你应该做什么不一定相同。考虑这是否真的是正确的实用方法,还是仅仅是元编程中的练习。