У меня есть пример, подобный приведенному ниже, в C ++, где я получаю указатель на базовый класс exampleParent
и хочу привести его к указателю на унаследованный класс example
(на самом деле я просто хочу вызвать функция на example
). Предостережение заключается в том, что унаследованный класс является шаблонным. В приведенном ниже примере я знаю, что шаблон имеет тип int
, поэтому проблем нет. В общем, что было бы хорошим способом сделать это, если я не знаю заранее тип шаблона?
class exampleParent{};
template<typename P>
class example: public exampleParent
{
public:
int do_something() const
{
std::cout<<"I am doing something"<<std::endl;
return 0;
}
};
boost::shared_ptr<const exampleParent> getPtr()
{
return boost::make_shared<const example<int>>();
}
int main()
{
boost::shared_ptr<const exampleParent> example = getPtr();
auto example_ptr = boost::dynamic_pointer_cast<const example<int>>(example);
return example_ptr-> do_something();
}
Одно решение, которое я предлагаю, состоит в том, чтобы изменить код на что-то вроде этого:
class exampleParent{};
class something_interface: public exampleParent
{
public:
virtual int do_something() const = 0 ;
};
template<typename P>
class example: public something_interface
{
public:
int do_something() const override
{
std::cout<<"I am doing something"<<std::end;
return 0;
}
};
boost::shared_ptr<const exampleParent> getPtr()
{
return boost::make_shared<const example<int>>();
}
int main()
{
boost::shared_ptr<const exampleParent> example = getPtr();
auto example_ptr = boost::dynamic_cast<const something_interface>(example);
return example_ptr->do_something();
}
Это сработало бы, но это похоже на взлом: something_interface
не должно действительно существуют, так как не имеют объектно-ориентированной интерпретации сами по себе.
Буду признателен за любую помощь!