模板参数:枚举,类或枚举类

4

Consider the following class:

template <class Endianness>
class bitcode
{};

Endianness有三种可能的取值: default_endianness, little_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++标准没有规定任何最佳/常见实践。个人而言,我从不使用“枚举字节顺序”(因为它会不必要地污染命名空间)。此外,这里可能会有人指出STL并不等同于标准库。 - stefan
最简单的选择可能是评估(刚发布的)Boost.Endian库,看它是否符合您的需求。如果您必须自己实现,那么这可能会给您一些设计提示。 - Praetorian
示例代码无法编译。请发布一个问题,说明您实际尝试了什么以及出现了什么问题。如果您的目标仅是征求意见,那么这里不是正确的地方。 - Yakk - Adam Nevraumont
3个回答

2

enum class是最合适的选择。它是类型安全的、作用域限定的枚举类型。您可以使用==运算符比较值,并使用模板参数应用模板特化和推导。

enum单独使用是一个未作用域限定的枚举类型。这些类型通常被认为是C++98和C的向后兼容特性。值将隐式转换为int,但这些整数是无意义的。

仅使用class可以获得分派标记。虽然这也可以工作,但您将没有==!=运算符,这可能会迫使您过度使用模板和重载。

考虑另一种模式——类型特征模式:包含静态数据成员和函数的类,因此您不必添加更多的模板参数。

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;

2

您需要根据自己的需求选择:

  1. enum: 主要用于向后兼容。
  2. enum class: 只有在您事先知道所有标签时才能使用。
  3. class: 任何人都可以引入新的标签,并且您可以使标签包含数据。

0

选择有些主观,但如果您想将其用作模板参数(例如,用于您的bitcode类模板),我建议使用类/结构标签。这比将基于类型的模板与基于特定常量值的模板混合使用更容易进行模板编程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接