我正在尝试创建一个给定整数输入的方法,进行一些计算(只是乘法和除法),将结果作为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
答案 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"
}