为了克服重复,我编写了一个模板化的严格弱排序谓词,以使其更容易。
通常,当需要多个字段和/或每个字段需要不同的顺序(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个参数?
答案 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());