Сформулирую вопрос на синтетическом тесте. Допустим имеется такой код
#include <iostream>
using namespace std;
class Base{};
class Derived : public Base {};
template<typename T> void Run(T *)
{
cout << "Run<T>" << endl;
}
template<> void Run<Derived>(Derived *)
{
cout << "Run<Derived>" << endl;
}
int main()
{
Derived * pD = new Derived();
Base * pB = pD;
Run(pD);
Run(pB);
return 0;
}
Требуется, чтобы вызовы Run(pD) и Run(pB) работали одинаково.
Пример синтетический. В реале вместо указателей используются boost::shared_ptr. Имеется массив из boost::shared_ptr<Base> в котором хранятся указатели на объекты полиморфных классов. Требуется, чтобы по передаче в шаблонную функцию элементов этого массива отрабатывали кастомизированные шаблонные уточнения шаблонных функций (частично уточненные тоже).
Скажу сразу, что вериницу вызовов типа
if (Derived1 * pd1 = dynamic_cast<Derived1 *>(pBase))
{
Run<Derived1 *>(pd1);
}
else if (Derived2 * pd2 = dynamic_cast<Derived2 *>(pBase))
{
Run<Derived2 *>(pd2);
}
if
...
else if (DerivedN * pdN = dynamic_cast<DerivedN *>(pBase))
{
Run<DerivedN *>(pdN);
}
писать не канает.