我需要在 std::less 和 std::greater 模板之间进行选择,并将一个模板存储在另一个模板中(我想我使用的是 C++ STL 词汇表吧……?)。我有这个:
template<typename> class stSortOrder;
stSortOrder = std::less;
if(sortby == "descending")
{
stSortOrder = std::greater;
}
显然它无法编译。我很确定这是因为我是 STL 的相对新手。
澄清:
我正在执行 this thread 中已接受的答案(公共(public)成员函数的变体)。
这是我想避免在 switch case 中重复的内容:
void CSubscriptionItem::sortMonitoredItems( int nColumnIndex, Qt::SortOrder ulOrder )
{
switch(nColumnIndex)
{
case CMonitoredItem::NAME:
{
if(ulOrder == Qt::DescendingOrder)
{
qSort( m_qlpcMonitoredItems.begin(),
m_qlpcMonitoredItems.end(),
make_method_comparer<std::less>(&CMonitoredItem::getName) );
}
else
{
qSort( m_qlpcMonitoredItems.begin(),
m_qlpcMonitoredItems.end(),
make_method_comparer<std::greater>(&CMonitoredItem::getName) );
}
break;
}
我想用一个已经根据排序顺序参数设置的模板替换 make_method_comparer<> 中的 std::less 和 std::greater。这将真正有助于减少代码大小。
我已经考虑了两个发布的答案,但它们似乎不起作用 - 可能是因为我不太熟悉模板,我只是错误地使用了它们。
最佳答案
可以做到:
template <typename T>
struct comparer
{
comparer(bool is_less) : is_less(is_less) {}
bool operator()(const T& x, const T& y) const
{
return is_less ? std::less<T>()(x, y) : std::greater<T>()(x, y);
}
private:
bool is_less;
};
但我宁愿这样做(更清晰):
template <typename T>
struct comparer
{
bool operator()(const T& a, const T& b) const
{
return is_less ? a < b : b < a;
}
private:
bool is_less;
};
关于c++ - 复制/分配 STL 模板,std::less 和 std:greater,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7001009/