mirror of
https://github.com/aantron/better-enums.git
synced 2025-12-06 16:56:42 +08:00
Also added a C++14 configuration to testing, but using it only for bidrectional map testing at the moment.
74 lines
2.5 KiB
C++
74 lines
2.5 KiB
C++
// This file was generated automatically.
|
|
|
|
// Scope and safety
|
|
//
|
|
// This tutorial shows some of the safety features of Better Enums: scope, how
|
|
// to control conversions, and the lack of a default constructor.
|
|
//
|
|
// Scope
|
|
//
|
|
// You have probably noticed by now that Better Enums are scoped: when you
|
|
// declare
|
|
|
|
#include <cassert>
|
|
#include <enum.h>
|
|
|
|
ENUM(Channel, int, Red = 1, Green, Blue)
|
|
|
|
// you don't get names such as Red in the global namespace. Instead, you get
|
|
// Channel, and Red is accessible as Channel::Red. This is no big deal in C++11,
|
|
// which has enum class. In C++98, however, this typically requires effort.
|
|
// Better Enums brings scope uniformly to both variants. So, despite the above
|
|
// declaration, you can safely declare
|
|
|
|
ENUM(Node, char, Red, Black)
|
|
|
|
// and everything will work as expected.
|
|
|
|
int main()
|
|
{
|
|
assert((+Channel::Red)._to_integral() != (+Node::Red)._to_integral());
|
|
|
|
// Implicit conversion
|
|
//
|
|
// A major complaint in C++98 is that enums are implicitly convertible to
|
|
// integers. Unfortunately, that is also true of Better Enums, and I haven't
|
|
// found a way to forbid the conversions and still have switch case checking.
|
|
//
|
|
// Better Enums can be made as safe as enum class in C++11, however. If your
|
|
// compiler supports enum class and you define BETTER_ENUMS_STRICT_CONVERSION
|
|
// before including enum.h, the following code will not compile:
|
|
//
|
|
// Channel channel = Channel::Red;
|
|
// int n = channel;
|
|
//
|
|
// The reason this is not enabled by default is explained in the reference page
|
|
// on strict conversions.
|
|
//
|
|
// Default constructor
|
|
//
|
|
// Better Enums don't have a default constructor, for three reasons.
|
|
//
|
|
// 1. Better Enums is a library that can't know what your application would
|
|
// like the default value to be for each enum, or whether you even want
|
|
// one.
|
|
// 2. I chose not to leave the default value undefined, because the idea is to
|
|
// encourage the convention that whenever a Better Enum exists, it has a
|
|
// valid value. This is borrowed from typed functional programming.
|
|
// 3. Better Enums is still under development, and this option is the most
|
|
// future-proof.
|
|
//
|
|
// So, if you uncomment this code, the file won't compile:
|
|
//
|
|
// Channel channel;
|
|
//
|
|
// This may be too strict, and I may relax it in the future. In the meantime,
|
|
// the solution sketched in the special values demo can replace default
|
|
// constructors for some purposes, and in a more flexible way. I may eventually
|
|
// have the default constructor calling a template function like the one in that
|
|
// demo.
|
|
|
|
|
|
return 0;
|
|
}
|