使用模板

时间:2015-07-20 06:22:19

标签: c++ templates

我需要在编译时生成引用表,以便我可以保存一些运行时计算,比如说我有如下用例

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]

这是正确的。

我的问题是,为什么没有其他人用这种方式,缺点?还有什么其他可能的方法? 资源会有所帮助!

1 个答案:

答案 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