看到了 Ruby 和 Python 中元编程的优势,但在实际工作中不得不使用 C++ 和 C 等低级语言,我正在考虑将两者结合起来的方式。一个例子是对任意结构/类的列表进行排序的简单问题。例如:
struct s{
int a;
int b;
};
vector<s> vec;
for(int x=0;x<10;x++){
s inst;
inst.a = x;
inst.b = x+10;
vec.push_back(inst);
}
最终,我希望能够使用最少量的样板代码对 inst 进行任意排序。我能看到的最简单的方法是使用 STL 的排序:
sort(vec.begin(),vec.end());
但这需要我编写一个可以比较“struct s”的方法。我宁愿做的是:
sort(vec,a ASC,b DESC);
这显然不是有效的 C++。
实现梦想的最佳方式是什么?如果我有某种类型化的宏,它会向我揭示 vector 元素的类型,那么编写 C 预处理器宏来创建进行排序所需的函数将是微不足道的。
备选方案似乎是编写我自己的预处理器。这很好用,直到我不得不再次推断出“vec”的类型。有没有简单的方法可以做到这一点?
上下文:更少的代码 = 更少的错误、编程竞赛。
最佳答案
对于以上,你可以使用Boost.Lambda内联编写比较函数,就像 Python lambda 一样:
using namespace boost::lambda;
std::sort(vec.begin(), vec.end(), (_1 ->* &s::a) < (_2 ->* &s::a));
这当然假设您按 a 排序。
如果您要查找的表达式要复杂得多,您最好编写一个单独的函数;即使在像 Python 和 Ruby 这样原生支持闭包的语言中,复杂的闭包也变得非常不可读。
警告上面的代码未经测试。
希望这对您有所帮助!
关于c++ - 自定义 C++ 预处理器/Typeful 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1586393/