Я пытаюсь написать метод, который принимает в качестве аргумента класс, производный от 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 или применить более строгую проверку типов компилятором, чтобы заставить его работать так, как мне хотелось бы?
std::string
- плохая идея. - person chris   schedule 28.01.2013NotAString
этоstd::string
. Итак, у вас есть класс, который по своему имени является не строкой, а строкой. Я собираюсь выпить что-нибудь. - person Zeta   schedule 28.01.2013