2011-01-10 103 views
0

结果类型我想专攻一个模板函数声明为:获取的功能

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

那是因为你传递一个值(read_function)作为一种类型。它不会像C++ 03那样工作。在C++ 0x中,你可以使用decltype(read_function)。 – ltjax 2011-01-10 15:27:35

+0

嗯,是吗?我还应该通过什么?我过去已经成功地将类函数与function_traits一起使用,并且我也将它用于函数,但我不知道为什么它在这种情况下不起作用...... – Robert 2011-01-10 19:07:04

回答

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) 
0

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

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

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

+0

实际上,函数模板仅基于返回类型非常频繁,例如,在返回类型上使用enable_if惯用法时。 – ltjax 2011-01-10 15:24:27