我想专门化一个声明为:
的模板函数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'的有效模板类型参数
想法?
答案 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)