我需要得到一个类的模板参数的成员函数的结果。不幸的是,我受限于c++ 03,不能使用decltype,但我可以使用tr1::result_of。我尝试了以下代码,但这不能与我的编译器(gcc 4.3,我也不能改变这一点):
#include <tr1/functional>
struct ReturnType {};
struct O
{
ReturnType f();
};
template<typename T> struct A
{
typename std::tr1::result_of<(&T::f)(T*)>::type f();
};
void f()
{
A<O> a;
ReturnType x = a.f();
}
以上代码反映了我对result_of<Fn(ArgTypes ...)
的理解:
如果Fn是指向非静态成员函数的指针,并且是第一种类型在ArgTypes中是成员所属的类(或它的引用),(或对派生类型的引用,或指向派生类型的指针),以及ArgTypes中的其余类型描述了它的参数。
传递给它一个指向成员函数的指针,并指定第一个形参类型为指向类的指针。但是,编译器打印以下错误:
result_of.cpp:12: error: `&' cannot appear in a constant-expression
result_of.cpp:12: error: a function call cannot appear in a constant-expression
result_of.cpp:12: error: template argument 1 is invalid
result_of.cpp:12: error: invalid use of ‘::’
result_of.cpp:12: error: expected ‘;’ before ‘f’
result_of.cpp: In function ‘void f()’:
result_of.cpp:18: error: ‘struct A<O>’ has no member named ‘f’
我不能改变类O,例如添加一个结果类型定义,所以我必须能够在编译时获得返回类型。
std::tr1::result_of
需要一个type参数。您正在传递一个非类型(指向成员的指针)。
这使得std::tr1::result_of
在没有decltype
的情况下非常有限。例如,您可以在包装器函数中使用它:
template <typename Ct, typename Arg>
void some_wrapper(Ct fun, Arg arg)
{
typedef typename std::tr1::result_of<Ct(Arg)>::type ret;
ret result = fun(arg);
// ... do something with result
}