考虑以下课程:
template <class Endianness>
class bitcode
{};
Endianness
可以是:default_endianness
,little_endian
或big_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
的声明当然取决于首选选项。)
答案 0 :(得分:2)
你必须选择适合你的目的:
enum
:这主要是为了向后兼容。enum class
:只能在事先知道所有标签时使用。class
:任何人都可以引入新标签,您可以让代码包含数据。答案 1 :(得分:0)
选择有些主题,但是如果你想将它用作模板参数(例如你的bitcode
类模板),我会坚持使用class / struct标签。这往往使模板编程比将类型上模板化的东西与特定常量值上模板化的东西混合更简单。
答案 2 :(得分:0)
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;