编译枚举中下一项的时间计算?

时间:2016-06-28 00:11:56

标签: c++ templates

例如,我有一个枚举

enum Option
{
   A = 0, B = 1, C = 2
};

我希望得到结果的下一个编译时间,即nextOf<A> = B, nextOf<B> = C, nextOf<C> = A,我该如何实现呢?

3 个答案:

答案 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