Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在模板函数中,若输入的类型是enum类,那个么如何使用std::底层类型?_C++_Templates_Sfinae_Static Cast_Enum Class - Fatal编程技术网

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> {};
}