C++ 获取函数的结果类型

C++ 获取函数的结果类型,c++,function,boost,typetraits,C++,Function,Boost,Typetraits,我想专门化一个声明为: template<typename Type> Type read(std::istream& is); a、 s.o.现在我想做一个宏,这样读取的专门化就很简单: SPECIALIZE_READ(read_integer) 所以我想我应该采用boost::function_traits的方式,并将SPECIALIZE_声明为: #define SPECIALIZE_READ(read_function) \ template<>

我想专门化一个声明为:

template<typename Type> Type read(std::istream& is);
a、 s.o.现在我想做一个宏,这样读取的专门化就很简单:

SPECIALIZE_READ(read_integer)
所以我想我应该采用boost::function_traits的方式,并将SPECIALIZE_声明为:

#define SPECIALIZE_READ(read_function) \
   template<> boost::function_traits<read_function>::result_type read(std::istream& is) { \
      return read_function(is); \
   }
#定义专门化读取(读取函数)\
模板boost::函数特性::结果类型读取(std::istream&is){\
返回读取功能(is)\
}
但VC++(2008)编译器抱怨:“boost::function\u traits”:“read\u integer”不是参数“function”的有效模板类型参数


思想?

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

template<typename Type> void read(std::istream& is, Type& objectToRead);
模板无效读取(std::istream&is,Type&objectToRead);

并将该类型用作参数。这与编译器通常在C++中对C++名称进行修饰的方式有很好的关系。

< P>我的知识是,除了C++中,没有一个机制(除了<代码> DECKEXTION/CODE >从函数指针中获得返回类型,而不传递相同的函数指针作为参数。

最简单的方法是接受退货类型的重复:

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

SPECIALIZE_READ(int, read_integer)
\define SPECIALIZE\u READ(类型,READ\u函数)\
模板类型读取(std::istream&is){\
返回读取功能(is)\
}
专门化读取(整型,读取整型)

实际上,函数模板仅基于返回类型重载的情况非常频繁,例如在返回类型上使用enable_if惯用法时。是的,重载没有问题,我在需要的地方简单地使用read等。问题似乎是boost::function_traits无法识别我传递给它的静态函数……是的,非模板函数的返回类型重载是一个问题,因为在这种情况下,您没有方法选择正确的函数。使用模板函数,您只需选择正确的实例化(例如,
read
-无需重载解析),这是因为您将值(read_函数)作为类型传递。在C++03中,它不会像那样工作。在C++0x中,您可以使用decltype(read_函数)?我还应该通过什么考试?过去,我在类方法中成功地使用了function_traits,我也在函数中使用过它,但我不知道为什么在这种情况下它不起作用……是的,这是我的计划B。我将继续使用它,尽管它没有“整洁”;)
#define SPECIALIZE_READ(type, read_function) \
   template<> type read(std::istream& is) { \
      return read_function(is); \
   }

SPECIALIZE_READ(int, read_integer)