作爲一般規則,是的,你可以部分專門化可變參數模板。
對於你的情況,我會用這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;
};
和Sentinel類:
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
不應該'運算符()'採取'元組<>'?這隻能用於排序整數... – Barry
@Barry排序整數,但相對於作爲模板參數傳遞的列(整數表示行索引,列表示列排序) – Shmoopy