一般严格弱序比较谓词模板函数
General strict weak order comparison predicate template function
为了克服重复,我编写了一个模板化的严格弱排序谓词,以使其更容易。
通常当需要多个字段和/或每个字段需要不同的顺序(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..._
,并在主函数中添加额外的typename... Tail
,因为我无法设置尾参数的类型,因为2个参数使用相同的类型,然后在参数包中继续进行下一次。虽然它可以工作,但我并不完全满意它,因为它破坏了IDE的错误检测(至少在VS中)。由于每个比较类型必须发送2个参数到函数,我找不到任何其他方法。是否有可能使模板类型推导期望一个参数包有2个参数?
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());
相关文章:
- 如何在 STL 函数中找到传递给谓词的元素的索引?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 如何在算法中使用谓词函数find_if?
- 是否可以使用三元切换/控制/谓词成员函数调用?
- 解释标准库排序函数C++的比较谓词的工作原理?
- 调用非静态函数作为谓词?
- <未解析的重载函数类型>调用二进制谓词
- 在 O(N) 时间内使用布尔谓词函数对向量进行排序
- 为什么指向非静态成员函数的指针不能用作标准库算法的一元谓词
- 条件变量的"wait"函数在提供谓词时导致意外行为
- 具有成员函数的一元谓词
- 创建一个区分值和谓词的模板函数
- 我的谓词函数有什么问题?
- STL中使用的C++自定义比较类型(函数谓词与较少结构)
- 在C++类中使用谓词函数指针
- 如何将isnan用作std::find_if(c++11)的谓词函数
- 确保谓词函数在c++模板化函数中有效
- 如何命名比较谓词函数排序向量
- std::remove_if中谓词函数的用法