我知道使用C++11会更简单,但是有没有办法在C++98中使它工作呢?我有以下示例代码:
#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中宏的使用,则更好了。