一般严格弱序比较谓词模板功能

时间:2015-09-16 03:55:46

标签: c++ sorting variadic-templates

为了克服重复,我编写了一个模板化的严格弱排序谓词,以使其更容易。

通常,当需要多个字段和/或每个字段需要不同的顺序(ASC / DESC)来对容器进行排序时,我们必须创建自定义比较谓词,这些谓词有时会变得太空或复杂,具体取决于实现。

例如(3个字段)

if(lhs->IsOnline() == rhs->IsOnline())
{
    if(lhs->GetLowestRankIndex() == rhs->GetLowestRankIndex())
        return lhs->GetName() < rhs->GetName();
    else
        return lhs->GetLowestRankIndex() > rhs->GetLowestRankIndex();
}
else
    return lhs->IsOnline() > rhs->IsOnline();

或其较小的空间但有些复杂的等价物

return lhs->IsOnline() > rhs->IsOnline() || (lhs->IsOnline() == rhs->IsOnline()
    && (lhs->GetLowestRankIndex() > rhs->GetLowestRankIndex() || (lhs->GetLowestRankIndex() == rhs->GetLowestRankIndex()
    && lhs->GetName() < rhs->GetName())));
  

现在我想问一个与可变参数模板有关的问题。您可能已经注意到,在我的回答中,我必须在基函数中添加未使用的变量typename..._,并在main函数中添加另外的typename... Tail,因为我无法设置尾参数的类型,因为2个参数使用相同的类型,然后在参数包中继续下一次。虽然它有效,但我并不满足于它,因为它破坏了IDE错误检测(至少在VS中)。

     

由于必须按比较类型向函数发送2个参数,因此我找不到任何其他方式。是否可以使模板类型推导需要一个参数包的2个参数?

1 个答案:

答案 0 :(得分:0)

template <typename Compare, typename..._>
bool SWOPredicate(const typename Compare::first_argument_type &lhs,
    const typename Compare::second_argument_type &rhs)
{
    Compare cmp;
    return cmp(lhs, rhs);
}

template <typename CompareHead, typename... CompareTail, typename... Tail>
bool SWOPredicate(const typename CompareHead::first_argument_type &lhs,
    const typename CompareHead::second_argument_type &rhs,
    const Tail &...tail)
{
    CompareHead cmp;
    return cmp(lhs, rhs) || (lhs == rhs && SWOPredicate<CompareTail..., Tail...>(tail...));
}

用法

return SWOPredicate<std::greater<bool>, std::greater<int>, std::less<std::string>>
    (lhs->IsOnline(), rhs->IsOnline(),
    lhs->GetLowestRankIndex(), rhs->GetLowestRankIndex(),
    lhs->GetName(), rhs->GetName());