Я все время делаю что-то вроде этого:
Animal *animal = ...
if (Cat *cat = dynamic_cast<Cat *>(animal)) {
...
}
else if (Dog *dog = dynamic_cast<Dog *>(animal)) {
...
}
else { assert(false); }
Как только я вижу закрытие на С++ 11, интересно, что-то вроде этого возможно?
Animal *animal = ...
typecase(animal,
[](Cat *cat) {
...
},
[](Dog *dog) {
...
});
Реализация typecase должна быть простой, но я все время сталкиваюсь с проблемой, когда он не может определить аргумент функции, поэтому он не может знать, к чему пытаться использовать dynamic_cast, потому что трудно выводить параметры lambdas. Взял несколько дней на поиск google и SO, но, наконец, понял, поэтому я поделился своим ответом ниже.