Скажи, что у меня есть:
template <typename T>
struct Foo {
T& func();
};
И я реализую Foo
: Foo<int> bar
Теперь я хочу получить тип возврата bar.func()
, Я пытался заставить result_of
работать со мной, но безрезультатно.
Что я действительно хотел бы, так это просто иметь возможность делать result_of_t<foo.func>
и покончим с этим, но я представляю, что это значительно сложнее? Как мне получить этот тип возврата?
РЕДАКТИРОВАТЬ:
Я надеялся сделать это без учета того, как bar
был объявлен. То есть я хочу просто быть в состоянии пройти bar.func
в result_of
или аналогичные и получить тип возвращаемого значения.
std::result_of
довольно раздражает в использовании на самом деле. Его синтаксис:
result_of<F(ArgTypes...)>
куда F
это нечто вызываемое, и все здесь является типом. В вашем случае вы хотите вызвать функцию-член: &Foo<int>::func
, Но это не значение указателя на член, который вам нужен, но тип. Итак, мы хотим decltype(&Foo<int>::func)
, Чтобы вызвать функцию-член, нужно передать экземпляр объекта в качестве первого аргумента.
Соберите все вместе, и мы получим:
using T = std::result_of_t<decltype(&Foo<int>::func)(Foo<int>&)>;
static_assert(std::is_same<T, int&>::value, "!");
Или мы могли бы просто использовать decltype
:
using T = decltype(std::declval<Foo<int>&>().func());
что гораздо более естественно.
Дано bar
Вот только:
using T = decltype(bar.func());
в отличие от:
using T = std::result_of_t<decltype(&decltype(bar)::func)(decltype(bar))>;
Других решений пока нет …