C++ 在模板函数中,若输入的类型是enum类,那个么如何使用std::底层类型?
我有一段代码,返回给定数字的某些位的值(我也使用静态_转换将枚举类作为一个数字计数)C++ 在模板函数中,若输入的类型是enum类,那个么如何使用std::底层类型?,c++,templates,sfinae,static-cast,enum-class,C++,Templates,Sfinae,Static Cast,Enum Class,我有一段代码,返回给定数字的某些位的值(我也使用静态_转换将枚举类作为一个数字计数) 模板 bool get_位(类型输入、uint8_t偏移、uint8_t n、类型*目的地) { if(偏移量+n>sizeof(类型)*8) 返回false; 类型位掩码=0; 对于(int i=0;i偏移和位掩码); 返回true; } 此函数尝试返回从偏移量开始的输入的n位的值。它适用于整型,但当我尝试将其用于枚举类时,编译失败。我尝试使用,然后它适用于枚举类,但不适用于整型:|。我怎样才能对他们两个都
模板
bool get_位(类型输入、uint8_t偏移、uint8_t n、类型*目的地)
{
if(偏移量+n>sizeof(类型)*8)
返回false;
类型位掩码=0;
对于(int i=0;i偏移和位掩码);
返回true;
}
此函数尝试返回从
偏移量开始的输入的n
位的值。它适用于整型,但当我尝试将其用于枚举类时,编译失败。我尝试使用,然后它适用于枚举类,但不适用于整型:|。我怎样才能对他们两个都使用它?我的意思是,如果类型是enum类,我想将输入转换为其基础类型
,执行一些位操作,然后将结果(使用静态
)存储到目标。但这些强制转换不应用于没有基础类型的整数类型。您可以使用SFINAE拆分枚举类实现:
模板
bool get_位(类型输入、uint8_t偏移、uint8_t n、类型*目的地){
//枚举类实现
}
和整体执行:
模板
bool get_位(类型输入、uint8_t偏移、uint8_t n、类型*目的地){
//整体实施
}
以上是C++17版本
对于C++11,您可能会遇到以下情况:
模板
bool get_位(类型输入、uint8_t偏移、uint8_t n、类型*目的地){
//枚举类实现
}
模板
bool get_位(类型输入、uint8_t偏移、uint8_t n、类型*目的地){
//整体实施
}
如果您经常需要它,可以在std::underground_type
上编写适配器。像这样的
namespace detail {
template<typename T, bool = std::is_enum<T>::value>
struct underlying_type { using type = T; };
template<typename T>
struct underlying_type<T, true> : ::std::underlying_type<T> {};
}
名称空间详细信息{
模板
底层结构_type{using type=T;};
模板
结构底层_类型:::std::底层_类型{};
}
当您使用detail::underground_type
时,默认参数中也会发生替换。当提供的类型不是枚举时,主模板(隐式)匹配参数,并且公开的类型是T
当提供的类型是枚举(并且只有在该类型)时,才会使用专门化。它所做的一切就是转发到标准特征。与问题无关:Type-bitmask=(Type{1}
namespace detail {
template<typename T, bool = std::is_enum<T>::value>
struct underlying_type { using type = T; };
template<typename T>
struct underlying_type<T, true> : ::std::underlying_type<T> {};
}