C++11ではenumの先行宣言ができるようになったので、それによってpImplイディオムと同じようにクラス内で宣言した場合に定義を分けることができます。
#include <iostream> #include <string> struct X { enum E : int; // 先行宣言 }; enum X::E : int { // 定義 A, B, C }; std::string f(X::E e) { switch (e) { case X::A: return "A"; case X::B: return "B"; case X::C: return "C"; } } int main() { std::cout << f(X::A) << std::endl; }
A