代码之家  ›  专栏  ›  技术社区  ›  Steven

在C++中添加所有枚举类的方法特化

  •  1
  • Steven  · 技术社区  · 5 年前

    我的bitstream类中有以下方法(广义地说):

    extern void StoreBits( unsigned int data, unsigned int numBits );
    
    template<typename T> inline void BitStream::WriteType( T value ) { StoreBits( value, sizeof(T) * 8 ) );
    
    template<> inline void BitStream::WriteType( float value ) { StoreBits( *(unsigned int*)&value, sizeof(float) * 8 ) );
    

    这是问题的一个小问题-我有一些枚举类实例被抛出到许多其他与位流相关的方法,如ReadType、StreamType(read or write)、SmallestRangeWrite<Min,Max>()等。

    template<typename T>inline void BitStream::WriteType( T value ) 
    {
      if (type_is_enum())
        StoreEnum<T>(value)
      else
        StoreBits( value, sizeof(T) * 8 ) );
    }
    

    2 回复  |  直到 5 年前
        1
  •  1
  •   Nikos C.    5 年前

    测试该类型是否为枚举 如果它不能转换成 u32 . 这可以让你区分正常 enum enum class . 如果它是枚举但不能转换为 ,那么它是一个 :

    template<typename T>
    inline void BitStream::WriteType(T value) 
    {
        if constexpr (std::is_enum_v<T> && !std::is_convertible_v<T, u32>)
            // enum class
            StoreEnum<T>(value)
        else
           // normal enum or other type that is convertible to u32
            StoreBits(value, sizeof(T) * 8 ));
    }
    

    StoreEnum StoreBits if constexpr 这里可以避免编译时的类型检查。

        2
  •  2
  •   Dmitry Kuzminov    5 年前

    constexpr如果 . 这意味着您不需要定义显式的专门化。这会起作用:

    template<typename T>inline void BitStream::WriteType(T value) 
    {
        if constexpr (std::is_enum_v<T>)
            StoreEnum<T>(value);
        else
            StoreBits(value, sizeof(T) * 8);
    }
    

    使用constexpr if很重要,因为如果出现以下情况之一,则会有编译失败的风险: StoreEnum StoreBits 未为类型定义 T