Мне нужно получить результат функции-члена параметра шаблона класса. К сожалению, я связан с 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, так что я должен иметь возможность получить возвращаемый тип во время компиляции.
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
}
но вы не можете использовать его так, как пытаетесь.