窃取伟大的idea of Rob,有一种方法可以指定如何增加枚举的值,虽然这不是很自动,但只要你的枚举始终具有相同的字段,你就可以这样做:
template <typename T, T(*INC)(const T), T start = {}>
struct managed_enum
{
enum
{
a = start,
b = INC(a),
c = INC(b),
};
};
使用此模板,您可以执行以下操作:
template<typename T>
constexpr T shift_left(const T value) { return value << 1; }
using shifted = managed_enum<int, shift_left<int>, 1>;
您要查找的枚举上的哪些结果 (see here)。好吧,shifted 不是枚举,而是结构,希望没关系。
定义不同的增量函数,可以自动增加不同的枚举族,只要它们都只有managed_enum这三个值(a,b,@ 987654329@):
template<typename T>
constexpr T shift_left(const T value) { return value << 1; }
template<typename T>
constexpr T increment(const T value) { return value + 1; }
template<typename T>
constexpr T bicrement(const T value) { return value + 2; }
using shifted = managed_enum<int, shift_left<int>, 1>;
using increment = managed_enum<int, increment<int>>;
using bicrement = managed_enum<int, bicrement<int>>;