【问题标题】:Template parameter: enum, class or enum class [closed]模板参数:枚举、类或枚举类
【发布时间】:2015-04-18 19:32:27
【问题描述】:

考虑以下类:

template <class Endianness>
class bitcode
{};

Endianness 可能是:default_endiannesslittle_endianbig_endian

问题如下:根据 C++14 和以下 C++17,最佳和常见做法是/将是什么? (通常我指的是标准库或boost 使用(或将使用)的那些。(+ 为什么?)

// The enum option
enum enum_endianness {default_endianness, little_endian, big_endian};

// The enum class option
enum class enum_class_endianness {default_endianness, little_endian, big_endian};

// The class option
class class_default_endianness{}; 
class class_little_endian{}; 
class class_big_endian{}; 

(注意:bitcode 的声明当然取决于首选选项。)

【问题讨论】:

  • C++ 标准不强制要求任何最佳/通用实践。就个人而言,我永远不会使用enum endianness(因为它不必要地污染了命名空间)。另外,可能会有人在这里指出 STL 不等于标准库。
  • 最简单的选择可能是评估(刚刚发布的)Boost.Endian 库,看看是否满足您的需求。如果您必须实现自己的,那可能会给您一些设计提示。
  • 示例代码无法编译。请发布您实际尝试过的问题以及问题所在。如果您的目标只是民意调查,那就错了。

标签: class templates c++11 enums c++14


【解决方案1】:

你必须选择适合你的目标:

  1. enum:主要是为了向后兼容。
  2. enum class:只有提前知道所有标签的情况下才能使用。
  3. class:任何人都可以引入新标签,你可以让标签包含数据。

【讨论】:

    【解决方案2】:

    enum class 是最合适的。它是一个类型安全的范围枚举。您可以使用== 运算符比较值,还可以使用模板参数应用模板特化和推导。

    enum 单独是一个无范围枚举。这些通常被认为是与 C++98 和 C 的向后兼容功能。值将隐式转换为 int,但这些整数将毫无意义。

    class 单独为您提供调度标签。虽然这可行,但您不会使用 ==!= 运算符,这可能会迫使您过度使用模板和重载。

    另一个需要考虑的模式是 type-traits 模式:一个包含静态数据成员和函数的类,因此您不必添加更多模板参数。

    enum class endianness {little_endian, big_endian};
    
    class little_endian_traits {
        static const enum endianness endianness = endianness::little_endian;
    };
    
    class big_endian_traits {
        static const enum endianness endianness = endianness::big_endian;
    };
    
    typedef little_endian_traits default_endian_traits; // depending on platform
    
    template< class traits >
    class bitcode;
    

    【讨论】:

      【解决方案3】:

      这个选择是有问题的,但如果你想把它用作模板参数(例如,对于你的bitcode 类模板),我会坚持使用类/结构标签。这往往使模板编程比将类型模板化的东西与特定常量值模板化的东西混合起来更简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-09
        相关资源
        最近更新 更多