Мне было интересно, есть ли способ сделать следующее в лучшем виде (легче читать, менее многословно).переключатель в зависимости от типа объекта
У меня есть объект Foo, который имеет конкретные типы реализации Foo, позволяет называть их Foo1 .. FooN.
У меня также есть строковая таблица описаний foo, например Foo1 «бары Foo1». То, что я хочу сделать, - это какая-то проверка типа в зависимости от того, какой тип Foo подходит для работы. В настоящее время я делаю:
std::string fooUtils::translate(Foo * foo){
if(typeid(foo) == typeid(Foo1){
return "bars the Foo1";
}
else if
...
}
Мне было интересно, есть ли лучший способ сделать это.
Первое, что я думаю о хранении std :: map < std :: typeinfo, std :: string> - это решение, на которое я стремлюсь, но я не знаю о каких-либо побочных эффектах введите информацию в качестве ключа к карте (есть ли какие-либо?). Мне также было интересно, есть ли что-нибудь, чтобы сравнивать типы в менее подробном виде, например boost :: is_type < Foo1, foo> или что-то вроде этого.
Вы не можете хранить 'typeinfo' напрямую в контейнере, поскольку 'typeinfo' не имеет общих конструкторов. Должен быть хитрым. –
Поиск функции шаблона type2enum в Google. Он создает перечисление из каждого из ваших типов (ваши классы), поэтому вы можете использовать перечисление в своем коммутаторе – madduci