Использование пары в вариационных шаблонах

Хорошо, я пытаюсь реализовать дерево диапазонов в n-измерениях, используя шаблоны с переменными координатами. У меня работает базовая настройка, но я хочу иметь возможность передать объект функции сравнения в список шаблонов для сортировки дерева по чему-то другому, чем std :: less.

Сначала я подумал, что я мог бы перегрузить список шаблонов версией, которая включает пару в качестве первого элемента, с парой, содержащей тип и функцию сравнения. Но я не вижу, чтобы получить строку объявления шаблона для компиляции. Visual C ++ (2015) начинается с C2079: «std :: pair :: first использует неопределенный класс ‘T'».

В любом случае, на код. Вот
небольшой фрагмент, чтобы показать, что я пытаюсь сделать:

template <class... Args> class rangetree{
};

template <class T, class... Args> class rangetree<T, Args...> {
public:
map <T, rangetree<Args...> * > tree;
};

Это все работает нормально. Но когда я добавляю другую версию rangetree с парой в качестве первого члена шаблона, у меня возникают проблемы:

template <pair<class T, class Compare>, class... Args> class rangetree<pair<T, Compare>, Args...>{
public:
map <T, rangetree <Args...> *, Compare> tree;
};

Это та часть, которую я могу отформатировать так, чтобы компилятор был доволен. Идея состоит в том, чтобы по желанию соединить элементы шаблона с функциями сравнения, если нужно использовать что-то отличное от less.

0

Решение

Синтаксис, который вы ищете:

template <class T, class Compare, class... Args>
class rangetree<pair<T, Compare>, Args...>
{
...
};

В качестве альтернативы, если все, что вы здесь делаете, предоставляет возможность добавить компаратор, вы можете перенести эту работу на метафункцию:

template <typename T>
struct range_types {
using key = T;
using compare = std::less<T>;
};

template <typename T, typename Comp>
struct range_types<pair<T, Comp>>
{
using key = T;
using compare = Comp;
};

template <class T, class... Args>
class rangetree<T, Args...>
{
map <typename range_types<T>::key,
rangetree <Args...> *,
typename range_types<T>::compare
> tree;
};
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]