Я думал, что смогу использовать 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
}