【问题标题】:C++: Using the same function layout with different operators and class methodsC++:使用具有不同运算符和类方法的相同函数布局
【发布时间】:2014-04-30 21:57:10
【问题描述】:

我有一个类似下面的函数布局:

bool foo( object1, object2, method_x, op_y, method_z ) {
    if (object1.method_x() op_y object2.method_z()) {
        do something;
}

对象 object1 和 object2 始终来自同一个类。但是他们的方法和介于两者之间的运算符是任意的。我知道您可以将运算符作为模板参数传递,这样就可以完成工作。但是成员函数呢?如果有帮助,他们不会争论。

【问题讨论】:

标签: c++ function templates member


【解决方案1】:

如果您想避免打字,宏是这里常用的(邪恶)机制。

在 C++1y 中,您可以使用多态 lambda 来实现类似的功能。

foo(object1, object2, 
      [](auto o) { return o.method_x(); }, 
      [](auto a, auto b) { return a == b }, 
      [](auto o) { return o.method_z() });

当然,只要方法是这样的,你可以

foo(object1, object2, 
      std::memfn(&Object1::method_x),
      [](auto a, auto b) { return a == b }, 
      std::memfn(&Object2::method_z));

更新:由于您添加了可以限制类型,您可以将所有 auto 替换为适当的类型并可能使用

template <typename T, typename Mx, typename Op, typename Mz>
bool foo(T& object1, T& object2, Mx method_x, Op op_y, Mz method_z ) {
    if (op_y(method_x(object1), method_z(object2)) {
        // do something;
}

【讨论】:

  • 我看不出为什么不在这里使用宏的原因.. 并非所有编译器都支持 lambdas(我的不支持),直到几乎所有编译器都支持,我建议坚持使用普通的类型和方法。
  • 谢谢!我不能在我的项目中使用 C++11,但我肯定会在其他地方尝试您的第一个解决方案:D。
  • @phyrrus9 你不需要 lambdas。您甚至可以使用std::less&lt;T&gt;、std::greater_equal&lt;T&gt; 等。
猜你喜欢
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多