复制/分配STL模板,std::less和std:greater

Copying/assigning STL templates, std::less and std:greater

本文关键字:std less greater 分配 STL 模板 复制      更新时间:2023-10-16

我需要在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;
            }
// ...