типы
Класс содержащий шаблонные указатели, не пойму как его создать чтобы при иницализации допускались разные типы IUserMenu
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_;
}
Сам класс IUserMenu
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() {}
};
Его наследник и ему подобные со строками и тд
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_;
*/
};
Ну и на выходе хотелось бы получать что-то типо такого
auto screen_stack{ ScreenStack{std::make_unique<AltMenu>() /*std::string*/, std::make_unique<MainMenu>() /* short*/} };
Ещё один...
Вопрос в том как создать класс в котором содержатся указатели на шаблонный класс с разными типами
А я надеялся что можно 😢
Это будет скорее union-like над указателями на разные типы, если без какой-либо связи между ними.
да, это единственное решение
Ну есть шаблонный интерфейс, от него наследники которые его специализируют в int string и ТД, вот, а главный класс содержит указатель на интерфейс
А как это примерно можно сделать? Не понимаю
шаблонный интерфейс - смерть для полиморфизма наследников
Окей, похоже кривая архитектура...
Это вроде CRTP чтоли? template < typename Base > struct IFace { }; struct Impl : IFace<Impl> /* ... */ ? Это не поможет, поскольку интерфейс у каждой имплементации с т.з. языка оказывается самостоятельным классом.
Да, вот я про это
А как можно по другому реализовать тоже самое?
Обсуждают сегодня