Обобщить член класса из определенного типа контейнера c (указателей на себя) - PullRequest
0 голосов
/ 19 июня 2020

Предположим, у вас есть следующий класс:

template<typename T>
class Node {
public:
    T data;
    std::vector<Node*> children;
};

Я исключил его методы, потому что хочу сосредоточиться на другой точке: разработчик ограничен использованием std::vector в качестве контейнера для children.

В контексте программирования в абстракцию , я хотел бы узнать, как сделать std::vector легко заменяемым на:

  1. другой контейнер из STL
  2. абстрактный класс со своим собственным набором методов (потенциально что-то, что могло бы стать или выполняться с помощью std::vector, std::map, std::list, et c.)

Какие способы sh вы знаете для достижения этой цели и каковы их основные преимущества и недостатки?

Помогут ли концепции C ++ 20 в решении этой задачи? Если да, то я бы хотел изучить и старый, и новый способ.

1 Ответ

3 голосов
/ 19 июня 2020

Вы можете добавить дополнительный параметр шаблона шаблона, например:

template<template <typename...> typename Container, typename T>
class Node {
public:
    T data;
    Container<Node*> children;
};

, а затем создать экземпляр Node с разными контейнерами:

Node<std::vector, int> n;
Node<std::set, int> m;

Однако, если вы хотите сделать что-то вроде

Node<std::map, int> m;

, вы столкнетесь с проблемами, потому что map требует как минимум 2 параметров шаблона, а вы используете только Node*.

Перед тем, как опробовать какую-либо конкретную стратегию реализации, я предлагаю вам подумать о том, как вы хотите использовать класс Node, поскольку это будет информировать реализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...