Как создать класс в котором будет шаблонный указатель на разные типы
Класс управляющий экранами.
class ScreenStack final
{
public:
explicit ScreenStack(std::initializer_list
<std::unique_ptr<IUserMenu<?>>> &list_menu)
{
for (auto& element : list_menu)
{
screens_.emplace(std::move(element.get()));
}
}
private:
std::stack<std::unique_ptr<IUserMenu<?>>> screens_;
}
Класс который является интерфейсом для наследников
template < typename T >
class IUserMenu
{
protected:
// Displays the screen interface to the user
virtual void display_interface() const = 0;
// title, body, select
virtual void print_title() const = 0;
virtual void print_body() const = 0;
virtual void print_select() const = 0;
// Reads user select input
std::unique_ptr<IStandartReader<T>> reader_;
std::vector<std::tuple<T, std::string>> choices_;
std::string location_name_;
public:
virtual ~IUserMenu() {}
};
Класс насленик IUserMenu
class MainMenu final : public IUserMenu<short>
{
public:
MainMenu() noexcept;
virtual void display_interface() const override;
private:
// title, body, select
virtual void print_title() const override;
virtual void print_body() const override;
virtual void print_select() const override;
/* IUserMenu
// std::vector<std::tuple<T, std::string>> choices_;
// std::unique_ptr<IStandartReader<short>> reader_;
// std::string location_name_;
*/
};
Как правильно сделать чтобы создавая класс ScreenStack инициализировать разными интерфейсами с шаблонным парамером которые унаследованы от него
auto screen_stack{ ScreenStack({std::make_unique<AltMenu>() /*std::string*/, std::make_unique<MainMenu>() /* short*/}) };
Ответы (1 шт):
Автор решения: HolyBlackCat
→ Ссылка
Не очень понятно, почему в интерфейсе вообще поля.
Можно вынести поля в шаблонного потомка - тогда интерфейс можно сделать нешаблонным, и проблема пропадает.