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 ответ

Решение

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
}

но вы не можете использовать его так, как пытаетесь.

Другие вопросы по тегам