Определение типа возврата функции шаблона - PullRequest
0 голосов
/ 24 января 2019

Учитывая, что у меня есть тип возвращаемого значения, который определяется аргументом шаблона, например:

template <typename T>
conditional_t<is_same_v<T, int>, int, char> foo(const T&);

Я думал, что мог бы использовать decltype(foo<float>), чтобы получить этот тип, но, похоже, он неработать.

У меня нет , поэтому я не могу использовать invoke_result_t.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

decltype(foo<float>) даст вам тип функции, например, char (float const&).Для получения типа возврата вы можете использовать

using R = decltype(foo(std::declval<T>()));   // T = float
0 голосов
/ 24 января 2019

Я думал, что смогу использовать decltype(foo<float>), чтобы получить этот тип, но, похоже, он не работает.

Выражение foo<float> относится к функции, поэтому decltype будет связано с типом функции шаблона (то есть char (const float&)).


То, что вы ищете:

decltype(foo(std::declval<float>()))

То есть выражение, возвращаемое функцией foo, когда в качестве входных данных задано float.

Конечно, вы можете заменить float любым типом для получения различных результатов функции шаблона.


Пример кода:

#include <type_traits>
#include <utility>

// Your template function
template <typename T>
std::conditional_t<std::is_same_v<T, int>, int, char> foo(const T&);

void test() {
  decltype(foo(std::declval<float>())) x;  // x is char in this case

  // We can test the type of x at compile time

  static_assert(!std::is_same_v<decltype(x), int>, "error");  // x is not an int
  static_assert(std::is_same_v<decltype(x), char>, "error");  // x is a char
}
...