関数の戻り値の型

#include <iostream>

template<typename F>
struct functrait;

//引数0個の関数の場合
template<typename R>
struct functrait<R(*)()> {
    typedef R Ret;
};

//実際に使ってみる
template<typename F>
void printret( F fn )
{
    typename functrait<F>::Ret ret = (*fn)();
    std::cout << ret << std::endl;
}
int foo()
{
    return 100;
}
int main( int, char** )
{
    printret(&foo);
}

> 100
こんな感じ。