0

我想专门声明一个模板函数:

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

然后我有很多静态实现

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

aso 现在我想做一个宏,以便读取的专业化非常简单:

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' 的有效模板类型参数

想法?

4

2 回答 2

0

也许我错了,但如果我清楚地记得我在 C++ 编程载体中的经历,函数可能不会因为返回类型的不同而被重载。我想如果你这样做,这些东西会起作用:

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

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

于 2011-01-10T14:51:34.297 回答
0

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

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

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

SPECIALIZE_READ(int, read_integer)
于 2011-01-10T16:15:35.433 回答