std::string から派生したクラスを引数として取るメソッドを作成しようとしています。このメソッドは、いくつかの異なる関数シグネチャでオーバーロードされています。std::string、または少なくとも実行時エラーで呼び出そうとすると、コンパイルが失敗することを望みますが、どうやらコンパイラは私には賢すぎるようです。
class NotAString : public std::string {
NotAString(std::string str) : std::string(str) { }
};
class Foo {
Foo();
void bar(NotAString);
void bar(int)
};
これはコンパイルして実行します
Foo foo();
foo.bar(NotAString("baz"));
しかし、これもそうです:
Foo foo();
foo.bar(std::string("baz"));
次のように typeid(str) を使用してみました:
void Foo::Bar(NotAString str) {
if(typeid(&str) != typeid(new NotAString()) {
throw std::bad_typeid();
}
}
ただし、std::string または NotAString を渡すと、常に例外がスローされます。次のように dynamic_cast を使用してみました。
void Foo::Bar(NotAString str) {
if (dynamic_cast<NotAString*>(&str) == NULL) {
throw std::bad_type();
}
}
しかし、例外をスローすることはありません。
目標は、文字列とキー値ルックアップのキーを表す文字列を区別できるようにすることです。NotAString クラスを変更したり、コンパイラによるより厳密な型チェックを適用して、これを希望どおりに動作させるにはどうすればよいですか?