c++ - 自定义 C++ 预处理器/Typeful 宏

标签 c++ macros c-preprocessor metaprogramming type-inference

看到了 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/

相关文章:

c++ - 在 C 或 C++ 中,如何防止头文件中的前一个 #define 影响后来包含的另一个头文件?

c++ - 为什么匿名命名空间优于静态全局变量?

c++ - list 常量与 C++ 关键字 "const"

C++ RAII析构函数异常

c - 使用类 C 函数的宏作为函数别名

c - 在 #define 中使用 openmp pragma

clojure - 如何优雅地结合资源和异常处理?

c - 有没有办法实现头文件重命名时不必修改的头保护?

C++ 字符串比较

C 预处理器库