复制/分配STL模板,std::less和std:greater
Copying/assigning STL templates, std::less and std:greater
我需要在std::less和std::greater模板之间进行选择,并将一个模板存储在另一个模板中(我认为我正在使用c++ STL词汇表正确…?)。我有这个:
template<typename> class stSortOrder;
stSortOrder = std::less;
if(sortby == "descending")
{
stSortOrder = std::greater;
}
显然不能编译。我很确定这是因为我在STL方面相对来说是个新手。
澄清:
我正在实现这个线程中接受的答案(公共成员函数的变化)。
下面是我想避免在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;
}
我想用一个模板替换std::less和std::greater在make_method_comparer<>中,根据排序顺序参数已经设置。这将真的有助于减少代码的大小。
我考虑了张贴的两个答案,但它们似乎不起作用-可能是因为我不太熟悉模板,我只是错误地使用它们。
可以这样做:
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;
};
如果您的编译器支持TR1,您可以简单地:
std::vector<int> v = { 3, 9, 17, 12, 5, 4 }; // NOTE: C++0x initialiser
const bool ascending = true;
typedef std::tr1::function<bool(int, int)> sort_func;
sort_func& func = ascending
? static_cast<sort_func>(std::less<int>())
: static_cast<sort_func>(std::greater<int>());
std::sort(v.begin(), v.end(), func);
或者,如果您有升压,将std::tr1::function
替换为boost::function
您将需要一个辅助类来在运行时解决这个问题,如下所示:
template <typename T>
class ChosedSorter {
public:
ChosedSorted(bool descending) : _d(descending)
{
}
bool operator()(const T& a, const T& b) {
if( _d )
return _less(a,b);
return _greater(a,b);
}
private:
bool _d;
std::less<T> _less;
std::greater<T> _greater;
}
然后像这样使用:
void CSubscriptionItem::sortMonitoredItems( int nColumnIndex, Qt::SortOrder ulOrder )
{
switch(nColumnIndex)
{
case CMonitoredItem::NAME:
{
ChosedSorted<QString> sorter(ulOrder == Qt::DescendingOrder);
std::sort( m_qlpcMonitoredItems.begin(),
m_qlpcMonitoredItems.end(),
sorter);
break;
}
// ...
相关文章:
- 如何使用std::min和std::less返回对象
- std::less是否应该允许在编译时比较不相关的指针?
- 如何在不重载"operator()"、"std::less"、"std
- SFINAE 检查 std::less 是否有效
- 为什么 std::less 是一个类模板
- 在默认参数中使用依赖范围作为 std::less 的类型时出现编译错误
- 如何在包含类的向量中使用 std::less
- 无法实例化binary_function std :: Less / std ::更大
- 委托条件为std::less或std::great
- Clang, std::shared_ptr and std::less/operator<
- std::less:错误 C2661:'std::less<_Ty>::less':没有重载函数需要 2 个参数
- 如何将比较器 a-la std::less 传递给 C 样式 Qsort
- 为什么 std::less 是一个函子
- 如何将重载的std::less用于std::map
- 在shared_ptr上修改std::less
- Std::less编译问题
- 我应该为比较函数扩展std::less吗?
- c++ 11对std::greater和std::less的条件表达式得到了不同类型的错误
- 复制/分配STL模板,std::less和std:greater
- 当构造将std::less作为参数时,对象类型看起来很奇怪