调用模板参数的成员函数的result_of

时间:2014-05-22 09:02:56

标签: c++ templates c++03 tr1 result-of

我需要获取类的模板参数的成员函数的结果。不幸的是,我绑定到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更改为例如添加结果typedef,所以我必须能够在编译时获得返回类型。

1 个答案:

答案 0 :(得分:1)

std::tr1::result_of需要类型参数。您传递的是非类型(指向成员的指针)。

这使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
}

但你不能像你想要的那样使用它。