Как правило, да, вы можете частично специализировать вариационные шаблоны.
В вашем случае я бы использовал эти 3 специализации:
Во-первых, общее определение, как вы можете видеть, что вам не нужно, чтобы определить его тело:
template <typename ...ColOrderType>
class Comparator;
Во-вторых, промежуточный шаг:
template <typename Col, typename ...ColOrderType>
struct Comparator<std::tuple<Col,bool>, ColOrderType...>
: public Comparator<ColOrderType...>
{
typedef Comparator<ColOrderType...> Base;
Comparator(std::tuple<Col,bool> const& firstOrder,
ColOrderType&&... nextOrders)
: Base(std::forward<ColOrderType>(nextOrders)...),
currectOrder(firstOrder)
{}
// this is implementation of `operator <` - feel free to change
template <typename T>
bool operator() (T const& lhs, T const& rhs)
{
auto&& lcol = get(std::get<0>(currentOrder), lhs);
auto&& rcol = get(std::get<0>(currentOrder), rhs);
bool order = std::get<1>(currentOrder);
if (lcol < rcol) return order;
if (rcol < lcol) return not order;
return Base::operator()(lhs, rhs);
}
std::tuple<Col,bool> currentOrder;
};
А класс сторожевого:
template <>
struct Comparator<>
{
template <typename T>
bool operator() (T const& lhs, T const& rhs)
{
return false;
}
};
Обратите внимание, что вы не сможете передавать типы, отличные от std :: tuple из двух элементов - определение Comparator
не позволяет это - поэтому общее определение не определено.
И о get
функции в этой части:
auto&& lcol = get(std::get<0>(currentOrder), lhs);
auto&& rcol = get(std::get<0>(currentOrder), rhs);
Я не знаю, как вы собираетесь получить значение столбца из строки на основе первого значения прошло tuple
- поэтому я полагаю, - вы знаете, как это сделать это - замените эту часть на ваш код.
@BaummitAugen Поскольку позже я хочу добавить специализацию шаблона (должен был упомянуть об этом) на основе типов столбцов – Shmoopy
Не следует ли 'operator()' принимать 'tuple <>'? Это можно использовать только для сортировки целых чисел ... – Barry
@Barry сортирует целые числа, но по отношению к столбцам, переданным в качестве аргументов шаблона (целые числа представляют индексы строк, а столбцы представляют, какие столбцы сортировать) – Shmoopy