Если вы знаете точный тип, вы можете сделать это как:
template <typename StaticType>
void DoIt(Interface &func)
{
static_cast<StaticType&>(func).StaticType::Do();
};
Если вам нужно вручную уменьшить значение до нужного вам типа (static_cast
хорошо, если вы знаете тип). Затем вам нужно квалифицировать вызов метода, отключите динамическую диспетчеризацию.
struct DerivedType : Interface {
virtual void Do() { std::cout << "Derived::Do" << std::endl; }
};
struct MostDerived : DerivedType {
virtual void Do() { std::cout << "MostDerived::Do" << std::endl; }
};
void processDerived( Interface & iface ) {
DoIt<DerivedType>( iface );
}
int main() {
MostDerived obj;
DoIt<Derived>( obj ); // Will call Derived::Do
}
Обратите внимание, что использование полного имени отключит динамическую диспетчеризацию, и это означает, что оно будет отправлено не типу объекта времени выполнения, а типу, который вы указали для вызова.