enumの先行宣言を使って定義を分ける

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