Лучший ответ - измерить, я думаю, что dynamic_cast
быстрее, чем сравнение любых, кроме самых коротких строк (или, возможно, даже коротких строк).
При этом попытка определить тип объекта обычно является признаком плохого замысла, согласно принципу подстановки Лискова вы должны просто обращаться с объектом так же, и виртуальные функции ведут себя правильно путь без осмотра типа снаружи.
Редактировать: После перечитывания вашего вопроса я остановлюсь на Нет подкласса, который я буду искать.
В этом случае вы можете использовать typeid
напрямую, я считаю, что это должно быть быстрее, чем любой из ваших вариантов (хотя поиск определенного типа все еще запах кода на мой взгляд)
#include <iostream>
#include <typeinfo>
struct top {
virtual ~top() {}
};
struct left : top { };
struct right : top { };
int main()
{
left lft;
top &tp = lft;
std::cout << std::boolalpha << (typeid(lft) == typeid(left)) << std::endl;
std::cout << std::boolalpha << (typeid(tp) == typeid(left)) << std::endl;
std::cout << std::boolalpha << (typeid(tp) == typeid(right)) << std::endl;
}
Выход:
правда
правда
false