我需要在编译时生成引用表,以便我可以保存一些运行时计算,比如说我有如下用例
static unsigned long long int table[21]={0,1,1};
template<long long N>
struct fib
{
static long long value()
{
fib<N-1>::value();
table[N] = table[N-1] + table[N-2];
}
};
template<>
struct fib<0>
{
static long long value()
{
return table[0];
}
};
template<>
struct fib<1>
{
static long long value()
{
return table[1];
}
};
template<>
struct fib<2>
{
static long long value()
{
return table[2];
}
};
#include<iostream>
using namespace std;
int main()
{
fib<20>::value(); // <<---- WARNING!
for(int i=0 ;i <21 ; ++i)
cout<<" "<<i<<":" << table[i];
cout<<endl;
return 0;
}
导致警告
fibs.cpp:在静态成员函数'static long long int fib :: value()'中: fibs.cpp:12:3:警告:函数返回non-void时没有return语句[-Wreturn-type]
这是正确的。
我的问题是,为什么没有其他人用这种方式,缺点?还有什么其他可能的方法? 资源会有所帮助!
答案 0 :(得分:0)
在模板结构中使用enum {value =}。 例如,
template <int N>
struct Fibonacci
{
enum
{
value = Fibonacci<N-1>::value + Fibonacci<N-2>::value
};
};
或
template <int N>
struct Fibonacci
{
static const long long value = Fibonacci<N-1>::value + Fibonacci<N-2>::value
};
此链接可能会有所帮助: Getting template metaprogramming compile-time constants at runtime