确定模板函数的返回类型

时间:2019-01-23 21:33:12

标签: c++ templates invoke return-type decltype

鉴于我有一个由模板参数确定的返回类型,如下所示:

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

我认为我可以使用decltype(foo<float>)来获得这种类型,但它似乎没有用。

我没有,所以我不能使用invoke_result_t

2 个答案:

答案 0 :(得分:1)

  

我认为我可以使用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
}

答案 1 :(得分:1)

decltype(foo<float>)将为您提供函数类型,例如char (float const&)。要获取返回类型,您可以使用

using R = decltype(foo(std::declval<T>()));   // T = float