我想知道的事情是一样的OP和偶然发现了这个问题。在阅读答案后,我受到了janm和RnR的启发,编写了一个lexicographicalMemberCompare
模板函数,该函数仅使用比较成员中的operator<
。它还使用boost::tuple,以便您可以指定尽可能多的成员。这里是:
#include <iostream>
#include <string>
#include <boost/tuple/tuple.hpp>
template <class T, class Cons>
struct LessThan
{
static bool compare(const T& lhs, const T& rhs, const Cons& cons)
{
typedef LessThan<T, typename Cons::tail_type> NextLessThan;
typename Cons::head_type memberPtr = cons.get_head();
return lhs.*memberPtr < rhs.*memberPtr ?
true :
(rhs.*memberPtr < lhs.*memberPtr ?
false :
NextLessThan::compare(lhs, rhs, cons.get_tail()));
}
};
template <class T>
struct LessThan<T, class boost::tuples::null_type>
{
static bool compare(const T& lhs, const T& rhs,
const boost::tuples::null_type& cons)
{
return false;
}
};
template <class T, class Tuple>
bool lexicographicalMemberCompare(const T& lhs, const T& rhs,
const Tuple& tuple)
{
return LessThan<T, typename Tuple::inherited>::compare(lhs, rhs, tuple);
}
struct Car
{
std::string make;
std::string model;
int year;
};
bool carLessThanCompare(const Car& lhs, const Car& rhs)
{
return lexicographicalMemberCompare(lhs, rhs,
boost::tuples::make_tuple(&Car::make, &Car::model, &Car::year));
}
int main()
{
Car car1 = {"Ford", "F150", 2009};
Car car2 = {"Ford", "Escort", 2009};
std::cout << carLessThanCompare(car1, car2) << std::endl;
std::cout << carLessThanCompare(car2, car1) << std::endl;
return 0;
}
希望这对某人有用。
个人风格 - 我会实现一个`strcmp()`函数(或方法),如果a等于b则返回0,如果a大于b则返回1,如果a小于b则返回-1,然后返回根据比较函数定义比较运算符(如果您喜欢)和/或方法。然后,我们只需要`bool carLessThanComparator(const Car&car1,const Car&car2){return cmp(car1,car2)== -1; }` – 2010-02-04 07:06:38