다음과 비슷한 중첩 열거 형이 여러 개 있습니다. 나는 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'로 중첩 된 enum에는 작동하지 않습니다. –
paperjam
구조체 대신 네임 스페이스 안에 열거 형을 넣으십시오. 이렇게하면 ADL이 시작될 것이고 (테스트하지는 않았다), enum이 선언 된 네임 스페이스에 관계없이 isValid를 호출 할 수 있어야한다. – paercebal