在 C++14 中,这可以通过返回类型推导优雅地解决。
// C++14
#include <type_traits>
template <typename T>
decltype(auto)
foo(T bar)
{
using R = std::conditional_t<sizeof(T) == 4, char, short>;
return static_cast<R>(bar);
}
在 C++11 中,您必须重复类型计算。
// C++11
#include <type_traits>
template <typename T>
typename std::conditional<sizeof(T) == 4, char, short>::type
foo(T bar)
{
using R = typename std::conditional<sizeof(T) == 4, char, short>::type;
return static_cast<R>(bar);
}
这可以通过使用decltype 来确定类型来缩短一点。
// C++11
#include <type_traits>
template <typename T>
typename std::conditional<sizeof(T) == 4, char, short>::type
foo(T bar)
{
using R = decltype(foo(bar));
return static_cast<R>(bar);
}
但坦率地说,使用简单的默认类型参数有什么问题?
// C++11
#include <type_traits>
template <typename T,
typename R = typename std::conditional<sizeof(T) == 4, char, short>::type>
R
foo(T bar)
{
return static_cast<R>(bar);
}
请注意,我已将return 语句中R 的值初始化替换为static_cast,以使编译器关于缩小转换的警告静音。不过,您确定这是您想要的吗?