为C ++中的所有枚举类添加方法专门化

史蒂文

我的位流类中有以下方法(广义上讲):

class BitStream
{
    void StoreBits( unsigned int data, unsigned int numBits );
    
    public:
    template<typename T>
    void WriteType( T value ) { StoreBits( value, sizeof(T) * 8 ) );

    template<>
    void WriteType( float value ) { StoreBits( *(unsigned int*)&value, sizeof(float) * 8 ) );
};

有人在WriteType上抛出了一个强类型的枚举类,显然该枚举不会自动转换为无符号整数。

我该怎么做才能写出使用相同函数命名来处理所有枚举情况的专业化程序?

这是一个琐碎的问题-我将枚举类实例抛出到我必须处理的许多其他BitStream成员方法上,例如ReadType,StreamType(读或写),SmallestRangeWrite <Min,Max>()等。

我有C ++ 17支持。我知道这里有std :: is_enum,但是我如何在这里专门研究它,尤其是在编译时?

我能以某种方式写:

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

我需要确保T为枚举时,不会编译StoreBits方法。仅在运行时避免使用分支是不够的。

Nikos C.

测试一下类型是否为枚举,以及是否不能转换为u32这使您可以区分正常enumenum class如果它是一个枚举但不能转换为u32,则它是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 ));
}

由于您的模板StoreEnumStoreBits函数模板不能同时使用两者,因此您需要在if constexpr此处使用以避免在编译时进行类型检查。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否可以将类中的枚举属性设置为“所有可用枚举”?

来自分类Dev

如何基于类型相关的类型专门化C ++模板类函数?

来自分类Dev

类方法的C ++类型特征:如果参数为枚举,则为部分专业化

来自分类Dev

C ++-部分专门化模板类成员函数

来自分类Dev

在目标c中为类的所有实例调用更新方法吗?

来自分类Dev

为包含typedef的类型专门化模板

来自分类Dev

如何为T以及T的所有后代专门化特质类

来自分类Dev

在C ++ 11中,我如何专门化基于返回类型接受函数对象的函数模板?

来自分类Dev

C ++:数组的功能模板专门化

来自分类Dev

C ++模板专业化-仅专门化某些方法,其余使用默认的impl

来自分类Dev

C ++部分专门化源中的类而不是标头

来自分类Dev

您如何专门化非模板类中没有参数的模板方法?

来自分类Dev

显式模板专门化不能具有存储类-成员方法专门化

来自分类Dev

非模板类方法的条件模板专门化

来自分类Dev

C ++-专门化类模板的成员函数

来自分类Dev

模板构造器中的模板类专门化

来自分类Dev

类模板专门化中的“预期为'>'”?

来自分类Dev

在C ++的类模板中是否可以有一个公共的,未专门化的静态成员?

来自分类Dev

类专门化中具有任何标签的枚举类型

来自分类Dev

当类型是指针时,模板类方法专门化失败

来自分类Dev

如何专门化C ++中的可变参数模板函数?

来自分类Dev

在C ++中有多个基本模板的情况下,模板专门化

来自分类Dev

(Objective-)C ++模板专门化上的重复符号

来自分类Dev

您如何专门化非模板化类中没有参数的模板化方法?

来自分类Dev

如何在C中枚举枚举中的所有内容?

来自分类Dev

模板构造器中的模板类专门化

来自分类Dev

在模板化类中专门化方法的正确方法

来自分类Dev

C++ - 在具有非类型模板参数的模板化类上专门化函数模板

来自分类Dev

为一组类型专门化函数模板

Related 相关文章

  1. 1

    是否可以将类中的枚举属性设置为“所有可用枚举”?

  2. 2

    如何基于类型相关的类型专门化C ++模板类函数?

  3. 3

    类方法的C ++类型特征:如果参数为枚举,则为部分专业化

  4. 4

    C ++-部分专门化模板类成员函数

  5. 5

    在目标c中为类的所有实例调用更新方法吗?

  6. 6

    为包含typedef的类型专门化模板

  7. 7

    如何为T以及T的所有后代专门化特质类

  8. 8

    在C ++ 11中,我如何专门化基于返回类型接受函数对象的函数模板?

  9. 9

    C ++:数组的功能模板专门化

  10. 10

    C ++模板专业化-仅专门化某些方法,其余使用默认的impl

  11. 11

    C ++部分专门化源中的类而不是标头

  12. 12

    您如何专门化非模板类中没有参数的模板方法?

  13. 13

    显式模板专门化不能具有存储类-成员方法专门化

  14. 14

    非模板类方法的条件模板专门化

  15. 15

    C ++-专门化类模板的成员函数

  16. 16

    模板构造器中的模板类专门化

  17. 17

    类模板专门化中的“预期为'>'”?

  18. 18

    在C ++的类模板中是否可以有一个公共的,未专门化的静态成员?

  19. 19

    类专门化中具有任何标签的枚举类型

  20. 20

    当类型是指针时,模板类方法专门化失败

  21. 21

    如何专门化C ++中的可变参数模板函数?

  22. 22

    在C ++中有多个基本模板的情况下,模板专门化

  23. 23

    (Objective-)C ++模板专门化上的重复符号

  24. 24

    您如何专门化非模板化类中没有参数的模板化方法?

  25. 25

    如何在C中枚举枚举中的所有内容?

  26. 26

    模板构造器中的模板类专门化

  27. 27

    在模板化类中专门化方法的正确方法

  28. 28

    C++ - 在具有非类型模板参数的模板化类上专门化函数模板

  29. 29

    为一组类型专门化函数模板

热门标签

归档