Давайте 1 st поговорим о простом решении вашей проблемы, написав функцию деривации:
template<typename T>
Base<T>* make_base(Base<T>* param) {
return param;
}
Вы можете использовать это следующим образом:
DerivedA d("hello world\n");
auto basePtr = make_base(&d);
basePtr->doSomething();
Это решение может быть улучшено, как в в этом примере , но так как я не думаю, что это лучшее решение, я не буду загромождать ответ, нооставьте такую оптимизацию на ваше усмотрение.
Но 2 и давайте поговорим об улучшении вашего дизайна.Вы заметите, что любой из стандартных контейнеров создает using value_type =
..., тем самым сохраняя типы шаблонов, которые они передали.Это важно для этой точной ситуации !Если вы публично добавите using value_type = T
в свой шаблонный класс Base
, вы обойдете проблему, с которой вы все вместе, без необходимости make_base
вы сможете сделать:
Base<decltype(d)::value_type>* basePtr = &d;
Важной концепцией продолжения здесь является то, что DerivedA
и DerivedB
do не имеют одинаковый базовый класс.Таким образом, вы никогда не сможете сделать что-то подобное
auto basePtr = make_base(&d);
basePtr = new DerivedB({});