Я хочу использовать шаблонную функцию для обработки как полиморфных, так и неполиморфных классов. Вот 3 основных класса.
class NotDerived
{
};
class Base
{
public:
virtual ~Base() {}
void base_method() {}
};
class Derived : public Base
{
};
Поскольку NotDerived не имеет виртуальных функций, я не могу использовать dynamic_cast, следующая функция шаблона:
template<class T>
auto foo(T& some_instance)
{
if (std::is_base_of_v<Base, T>)
{
//CASE_1: Works for d and b
/*some_instance.base_method();*/
//CASE_2: Works for d and b
/*auto lamb1 = [](T& some_instance) {some_instance.base_method(); };
lamb1(some_instance);*/
auto lamb2 = [](T& some_instance) {((Base&)some_instance).base_method(); };
lamb2(some_instance);
}
}
Основные функции делают это:
void main()
{
Derived d{};
Base b{};
NotDerived nd{};
foo(d);
foo(b);
foo(nd);
}
Теперь я понимаю, почему CASE_1 не работает в случае передачи переменной nd
, но я не могу понять, что мне нужно явно привести some_instance
в функцию lamb2, чтобы вызвать base_method.
Может кто-нибудь объяснить, почему CASE_1, CASE_2 не работают, а CASE_3 работает.
Под работой я имею в виду вызов base_method, если это возможно, без dynamic_casting.
Также возможно ли использовать constexpr
для обработки таких случаев статического полиморфизма или скомпилированного полиморфизма (надеюсь, это будет правильно называть так)