1

我有一些基于此的工作代码: Sorting a vector of objects by a property of the object

我重新措辞并去掉了很多不必要的东西,让我更容易理解。我仍然无法确切地知道代码在做什么,有人可以评论这段代码或逐步引导我解释这里发生了什么吗?我对模板的主要内容感到困惑。

#import <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>

using namespace std;


//Can someone please explain this template stuff???
template < typename TYPE, typename MTYPE>
struct member_comparer {

    MTYPE TYPE::*val;

    explicit member_comparer( MTYPE TYPE::*p ) { 
        val = p;
    }

    bool operator ()( TYPE  lhs, TYPE  rhs )  {
        return lhs.*val < rhs.*val;
    }
};



template<typename TYPE, typename MTYPE>
member_comparer<TYPE, MTYPE> make_member_comparer( MTYPE TYPE::*p ) {
    return member_comparer<TYPE, MTYPE>( p );
}

//PLEASE EXPLAIN THE STUFF ABOVE HERE ^





struct Number
{
    //declare our strings
    int i;
    string s;

    //preset the values in the constructor!
    Number( int i, string s ) { 
        this->i = i;
        this->s = s;
    }
};



int main()
{   

    //declare a new vector of Numbers
    vector<Number> vec;

    //fill in the vector
    vec.push_back(Number(2, "two"));
    vec.push_back(Number(8, "eight"));


    // sort by i, ascending
    sort( vec.begin(), vec.end(), make_member_comparer( &Number::i ) );
    cout << vec.front().i << ", " << vec.back().i << "\n";
    //outputs 2, 8


    // sort by s, ascending
    sort( vec.begin(), vec.end(), make_member_comparer( &Number::s ) );
    cout << vec.front().s << ", " << vec.back().s << "\n";
    //outputs eight, two
}
4

2 回答 2

1
template < typename TYPE, typename MTYPE>
struct member_comparer {

MTYPE TYPE::*val;     // public field, a pointer to MTYPE

explicit member_comparer( MTYPE TYPE::*p ) {   // explicit constructor
    val = p;
}

bool operator ()( TYPE  lhs, TYPE  rhs )  {  // operator () (TYPE lhs, TYPE rhs)
                                            // this is typical for a functor
    return lhs.*val < rhs.*val;
}
};


template<typename TYPE, typename MTYPE>
member_comparer<TYPE, MTYPE> make_member_comparer( MTYPE TYPE::*p ) {
    return member_comparer<TYPE, MTYPE>( p );      // return an instance of the functor 
}
于 2013-10-03T17:47:47.550 回答
1

MTYPE TYPE::*val;是类中成员的指针TYPE。该成员的类型为MTYPE

template <typename TYPE, typename MTYPE> struct它是由两种类型参数化的结构。 TYPE应该是类,MTYPE应该是成员的类型。

template<typename TYPE, typename MTYPE>
member_comparer<TYPE, MTYPE> make_member_comparer( MTYPE TYPE::*p ) {
    return member_comparer<TYPE, MTYPE>( p );
}

make_member_comparer是一个避免使用的辅助函数:

member_comparer<Number, int>(&Number::i)

于 2013-10-03T18:03:16.107 回答