Получение Типа Возвращения Метода Шаблонного Объекта

Скажи, что у меня есть:

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 или аналогичные и получить тип возвращаемого значения.

4

Решение

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))>;
6

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

Других решений пока нет …

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