我知道这对C++ 11来说会更简单,但有没有办法使它在C++ 98中工作?我有以下示例代码:由某个数据成员对结构的STL容器进行排序
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <vector>
#include <algorithm>
#include <iostream>
struct foo {
foo(const int a_, const double b_): a(a_), b(b_) {}
int a;
double b;
};
std::ostream &operator<<(std::ostream &out, const foo &f)
{
out << f.a << ',' << f.b;
return out;
}
#define DO_SORT(CONTAINER, TYPE, MEMBER) \
std::sort(CONTAINER.begin(), CONTAINER.end(), boost::lambda::bind(&TYPE::MEMBER, boost::lambda::_1) > boost::lambda::bind(&TYPE::MEMBER, boost::lambda::_2));
int main()
{
std::vector<foo> v;
v.push_back(foo(1, -2.0));
v.push_back(foo(3, -3.0));
v.push_back(foo(2, -1.0));
std::cout << "Original" << std::endl;
std::for_each(v.begin(), v.end(), std::cout << boost::lambda::_1 << "\n");
std::cout << "Sort by a" << std::endl;
DO_SORT(v, foo, a);
std::for_each(v.begin(), v.end(), std::cout << boost::lambda::_1 << "\n");
std::cout << "Sort by b" << std::endl;
DO_SORT(v, foo, b);
std::for_each(v.begin(), v.end(), std::cout << boost::lambda::_1 << "\n");
}
这能够完成任务,但它要求容器内的类型来指定。我正在寻找一种能够写出DO_SORT(v, a)
的方法。我尝试用BOOST_TYPEOF(CONTAINER)::value_type
替换宏中的TYPE
,但编译器不喜欢这样。
有没有办法在C++ 98中做到这一点,而不需要指定类型?另外,如果有一些方法可以减少甚至删除C++ 98中的宏,那么这也会很好。
@JerryCoffin这不起作用,因为CONTAINER是容器的一个实例,而不是类型本身。 – 2015-02-06 18:24:07
糟糕 - 我应该仔细阅读。抱歉。 – 2015-02-06 21:34:13