获取结果类型的函数

时间:2011-01-10 14:34:31

标签: c++ function boost typetraits

我想专门化一个声明为:

的模板函数
template<typename Type> Type read(std::istream& is);

然后我有很多静态实现

static int read_integer(std::istream& is);

a.s.o。现在我想做一个宏,以便读取的特殊化就像:

SPECIALIZE_READ(read_integer)

所以我想我会采用boost :: function_traits方式并将SPECIALIZE_READ声明为:

#define SPECIALIZE_READ(read_function) \
   template<> boost::function_traits<read_function>::result_type read(std::istream& is) { \
      return read_function(is); \
   }

但VC ++(2008)编译器抱怨:'boost :: function_traits':'read_integer'不是参数'Function'的有效模板类型参数

想法?

2 个答案:

答案 0 :(得分:0)

也许我错了,但如果我记得我在C ++编程载体中遇到的情况,那么函数可能不会因返回类型的不同而过载。我想如果你这样做的话会有用:

template<typename Type> void read(std::istream& is, Type& objectToRead);

并使用Type作为参数。如果我记得很清楚,这与编译器通常装饰c ++名称的方式有关。

答案 1 :(得分:0)

据我所知,没有机制(C ++ 0x中的decltype除外)从函数指针获取返回类型,而不将相同的函数指针作为参数传递。

最简单的方法是接受返回类型的重复:

#define SPECIALIZE_READ(type, read_function) \
   template<> type read(std::istream& is) { \
      return read_function(is); \
   }

SPECIALIZE_READ(int, read_integer)