用于双乘法的模板元编程

时间:2014-06-24 08:55:08

标签: c++ templates double template-meta-programming c++03

我正在尝试创建一个给定整数输入的方法,进行一些计算(只是乘法和除法),将结果作为double返回。这个方法应该在编译时进行计算。

我尝试过不同的方法:

template <int n> struct Try
{
    static const double result = 1.0 / (double)n * Try<1>::result;
};

template <> struct Try<1>
{
    static const double  result = 1.0;
};

但仍然没有成功,我总是编译错误。

编辑:我没有使用C++11

3 个答案:

答案 0 :(得分:2)

归功于@ForEveR,我在答案中修正了一个小错误。请注意, nothing 可确保计算实际在编译时发生。没有什么能保证编译时间。无耻地复制下面的答案。

您无法使用const初始化类中非整数类型的变量,只能使用constexpr进行初始化。由于你不能使用C ++ 11,你可以试试这个

template <int n> struct Try;

template <> struct Try<1>
{
static const double  result;
};

template <> const double Try<1>::result = 1.0;

template<int n> struct Try
{
static const double result;
};

template<int n>
const double Try<n>::result = 1.0 / (double)n * Try<1>::result;

答案 1 :(得分:0)

要做你想做的事,你可以使用另一个常量来帮助你计算结果

这是一个功能性的例子。

#include <iostream>

template <int n> struct Try;

template<int n> struct Try
{
static const double result;
static const double _tmp;
};

template<int n>
const double Try<n>::_tmp = n*2; // another usefull operation because it's useless here
template<int n>
const double Try<n>::result = 1.0 / ((double)n * Try<n>::_tmp);


int main() {
        std::cout << Try<5>::result << std::endl;
}

答案 2 :(得分:0)

您的问题不是很清楚,但在我看来,您希望将分数的编译时评估转换为双浮点数。这可以通过非常简单的模板功能来完成。这个工作示例在.rodata部分创建了双精度数(使用gcc 4.8.2和clang 3.4测试):

#include <iostream>

template<int N, int M> inline const double& Frac() {
  static const double result = (double)N/M;
  return result;
}

int main() {
  std::cout << Frac<3, 4>() << std::endl;     // prints "0.75"
}