例如,我有一个枚举
enum Option
{
A = 0, B = 1, C = 2
};
我希望得到结果的下一个编译时间,即nextOf<A> = B, nextOf<B> = C, nextOf<C> = A
,我该如何实现呢?
答案 0 :(得分:2)
您可以使用constexpr
编写编译时功能。
#include <iostream>
enum Option
{
A = 0, B = 1, C = 2
};
constexpr Option nextOf(const Option option){
switch (option){
case A: return B;
case B: return C;
}
return A;
}
int main (){
constexpr Option next = nextOf(A);
}
答案 1 :(得分:1)
另一种方法可能是使用结构的部分特化 举个例子:
enum Option { A = 0, B = 1, C = 2 };
template<Option>
struct next;
template<> struct next<A> { static constexpr Option value = B; };
template<> struct next<B> { static constexpr Option value = C; };
template<> struct next<C> { static constexpr Option value = A; };
template<Option O>
constexpr Option next_v = next<O>::value;
int main (){
constexpr Option next = next_v<A>;
static_assert(next_v<B> == C, "!");
}
答案 2 :(得分:0)
由于enum
是伪装的整数,你可以简单地定义
contexpr Option next(Option u)
{
return (Option(int(u)+1);
}
当然这会让下一个(C)成为未定义的行为。替代方案可以是%3结果,因此next(C)= A(int-s上典型的wrap-aroud算法)
return (Option((int(u)+1)%3);
或对输入进行过滤,抛出异常,但这样就不再需要consterxpr
。