确定模板函数的 Return 类型
Determining the Return Type of a Template Function
鉴于我有一个由模板参数确定的 return 类型,如下所示:
template <typename T>
conditional_t<is_same_v<T, int>, int, char> foo(const T&);
我以为我可以使用 decltype(foo<float>)
来获得这种类型,但它似乎不起作用。
我没有c++17所以我不能使用invoke_result_t
。
I thought that I could use decltype(foo<float>)
to get this type but it doesn't seem to be working.
表达式foo<float>
指的是函数,所以decltype
将与模板函数的类型相关(即char (const float&)
)。
您要找的是:
decltype(foo(std::declval<float>()))
即当输入float
时,函数foo
返回的表达式。
当然,你可以将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
}
decltype(foo<float>)
会给你一个函数类型,类似于 char (float const&)
。要获得 return 类型,您可以使用
using R = decltype(foo(std::declval<T>())); // T = float
鉴于我有一个由模板参数确定的 return 类型,如下所示:
template <typename T>
conditional_t<is_same_v<T, int>, int, char> foo(const T&);
我以为我可以使用 decltype(foo<float>)
来获得这种类型,但它似乎不起作用。
我没有c++17所以我不能使用invoke_result_t
。
I thought that I could use
decltype(foo<float>)
to get this type but it doesn't seem to be working.
表达式foo<float>
指的是函数,所以decltype
将与模板函数的类型相关(即char (const float&)
)。
您要找的是:
decltype(foo(std::declval<float>()))
即当输入float
时,函数foo
返回的表达式。
当然,你可以将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
}
decltype(foo<float>)
会给你一个函数类型,类似于 char (float const&)
。要获得 return 类型,您可以使用
using R = decltype(foo(std::declval<T>())); // T = float