Как разрешить передачу признаков, содержащих функтор, в дженериковое дерево c? - PullRequest
0 голосов
/ 29 апреля 2020

Я пытался создать B-дерево, которое принимает черту для содержимого узла и порядка дерева. Идея состоит в том, чтобы позволить признаку передавать функтор для печати внутри узла, вставки в узел и его обхода. Это должно позволить обобщать только чертой B + или B *. Однако я столкнулся с проблемой, заключающейся в том, что массив ptr для детей требовал определения узла, поэтому я добавил функторы для обработки этих действий, которые нужно передать, но я не могу понять, как их вызывать.

Это узел.

template <class TreeTrait> struct Node {
  static constexpr int BTREE_ORDER = TreeTrait::BTREE_ORDER;

  using DataType = typename TreeTrait::DataType;
  using DataContainer = typename TreeTrait::DataContainer;
  using ChildrenContainer = typename TreeTrait::ChildrenContainer;
  using NodePtr = typename TreeTrait::NodePtr;

  DataContainer data;
  ChildrenContainer children;

  typename TreeTrait::node_search search;
  typename TreeTrait::node_insert insert;
  typename TreeTrait::node_print print;

  void insert_in_node(int pos, const DataType &value);
};

Это BTree:

template <class TypeTrait> class BTree {
public:
  static constexpr int BTREE_ORDER = TypeTrait::BTREE_ORDER;
  using DataType = typename TypeTrait::DataType;
  using ChildrenContainer = typename TypeTrait::ChildrenContainer;
  using DataContainer = typename TypeTrait::DataContainer;
  using NodeIterator = typename TypeTrait::iterator;

  typename TypeTrait::search node_search;

  using Node = typename ::Node<BTree<TypeTrait>>;
  using NodePtr = typename std::shared_ptr<Node>;

private:
  enum class state { BT_OVERFLOW, BT_UNDERFLOW, NORMAL };
  NodePtr root;

public:
  BTree();

};

Это моя желаемая черта.

template <class T> struct Order3Trait {
  int count = 0;
  static constexpr int BTREE_ORDER = 3;
  using DataType = T;
  using DataContainer = typename std::array<T, BTREE_ORDER + 1>;
  using Node = typename ::Node<BTree<Order3Trait<T>>>;
  using ChildrenContainer =
      typename std::array<std::shared_ptr<Node>, BTREE_ORDER + 2>;
  using iterator = typename DataContainer::iterator;

  std::function<iterator(const int &, int &, const DataType &)> search =
      [](const DataContainer &container, const T &value) {
        return std::find_if(container.begin(), container.end(), value);
      };

  std::function<void(const DataContainer &)> print =
      [](const DataContainer &container) {
        std::for_each(container.begin(), container.end(),
                      [](const auto &value) { std::cout << value; });
      };

  std::function<void(const int &, int &, const DataType &)> insert =
      [&](const int &pos, int &count, const DataType &value,
          const DataContainer &data, const ChildrenContainer &children) {
        auto j = count;
        while (j > pos) {
          data[j] = data[j - 1];
          children[j + 1] = children[j];
          j--;
        }
        data[j] = value;
        children[j + 1] = children[j];
        count++;
      };

};

#endif

РЕДАКТИРОВАТЬ: Я хотел бы быть возможность передавать Order3Trait типы и способы печати, поиска и вставки.

...