次のようないくつかの入れ子になった列挙型があります。私は、isValid()
関数をenum
定義に可能な限り近いものとして定義したいと考えています。実際のコードは、ネストされた名前空間と構造体の複数のレベルでより冗長です。入れ子になった列挙体のC++操作
struct S
{
enum E { V1, V2 };
/* ????? */ bool isValid(E e) { return e==V1 || e==V2; }
};
template <typename Enum>
bool legalValue(Enum e)
{
return isValid(e);
}
グローバル名前空間にisValid()
を配置することなく、このコードを動作させるために、それは可能ですか?
isValid()
が優れているかどうかについてはお答えください。この質問は、operator<<()
をオーバーライドして、意味のある列挙値をストリームできるようにするためのものと同じです。その場合、operator<<()
のエッセンスはstruct S
の体内にある方法はありますか?
ここで何が問題なのかわかりません。 'isValid()'関数を 'static'にし、' legalValue() '関数を' return S :: isValid(e); 'に変更してください。これはコンパイルすべきだと思います... –
アイデアは'legalValue()'は関連する 'isValid()'関数を持つ 'enum'に対して動作するはずです。 'class'や' struct'でネストされた列挙型では機能しません。 –
paperjam
構造体ではなく、名前空間内に列挙型を入れてみてください。このように、ADLは(私はそれをテストしていない)キックする必要があります、あなたはenumが宣言されている名前空間に関係なくisValidを呼び出すことができるはずです。 – paercebal