模板参数依赖 using/typedef 声明
Template argument dependent using/typedef declaration
如何编写依赖于模板参数的 using
(或 typedef
)声明?
我想实现这样的目标:
template<typename T>
class Class
{
// T can be an enum or an integral type
if constexpr (std::is_enum<T>::value) {
using Some_type = std::underlying_type_t<T>;
} else {
using Some_type = T;
}
};
这正是 std::conditional
的用途:
template <class T>
class Class
{
using Some_type = typename std::conditional_t<std::is_enum<T>::value, std::underlying_type<T>, std::type_identity<T>>::type;
};
std::type_identity
来自 C++20,如果您没有,很容易自己复制:
template< class T >
struct type_identity {
using type = T;
};
这是必需的,因为如果 T
不是枚举,则 std::underlying_type<T>::type
不存在,并且 std::conditional
无法阻止该计算的发生。
如何编写依赖于模板参数的 using
(或 typedef
)声明?
我想实现这样的目标:
template<typename T>
class Class
{
// T can be an enum or an integral type
if constexpr (std::is_enum<T>::value) {
using Some_type = std::underlying_type_t<T>;
} else {
using Some_type = T;
}
};
这正是 std::conditional
的用途:
template <class T>
class Class
{
using Some_type = typename std::conditional_t<std::is_enum<T>::value, std::underlying_type<T>, std::type_identity<T>>::type;
};
std::type_identity
来自 C++20,如果您没有,很容易自己复制:
template< class T >
struct type_identity {
using type = T;
};
这是必需的,因为如果 T
不是枚举,则 std::underlying_type<T>::type
不存在,并且 std::conditional
无法阻止该计算的发生。