私はこの「より良い」列挙型クラスを持っているC++での型変換をどのようにしてenum型にコンパイルできないのですか?
- 無効な値を含めることはできません、と
- 、列挙型の値が明示的に設定されていないまで使用
次のようにすることはできません。
class Symmetry
{
public:
enum Type {
GENERAL, SYMMETRIC, HERMITIAN,
SKEW_SYMMETRIC, SKEW_HERMITIAN, UNINITIALIZED
};
Symmetry() { t_ = UNINITIALIZED }
explicit Symmetry(Type t) : t_(t) { checkArg(t); }
Symmetry& operator=(Type t) { checkArg(t); t_ = t; return *this; }
operator Type() const {
if (t_ == UNINITIALIZED) throw runtime_error("error");
return t_;
}
private:
Type t_;
void checkArg(Type t) {
if ((unsigned)t >= (unsigned)UNINITIALIZED)
throw runtime_error("error");
}
};
これにより、次のコードを書くことができます。
Symmetry s1(Symmetry::SYMMETRIC);
Symmetry s2;
s2 = Symmetry::HERMITIAN;
Symmetry s3;
if (Symmetry::GENERAL == s3) // throws
私の問題は、コンパイラのような構造が可能になることである:
Symmetry s1((Symmetry::Type)18); // throws
Symmetry s2;
s2 = (Symmetry::Type)18; // throws
が、私は例外をスローすることによってこの問題を解決しますが、私は全く(コンパイル時のエラー)をコンパイルしていないようなコードを好むだろう。これを管理する方法はありますか?
あなたはコンパイル時定数のために問題を解決できたとしても、どのような誰かがしようとした場合、 'シンメトリーS1((対称::タイプ)は、x);'? –
intからのすべてのキャストを禁止するか、無効なintからのキャストを禁止するだけですか? –
Oliに:それはポイントです、私はこのコードをコンパイルしないことを望みます。どういうわけか、他のタイプのSymmetry :: Type型にキャストできないようにしてください。 –