Я пытался создать 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
типы и способы печати, поиска и вставки.