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
}

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

1

Другие решения


По вопросам рекламы [email protected]