【问题标题】:Passing increment/decrement operator to a function将递增/递减运算符传递给函数
【发布时间】:2015-02-16 13:21:27
【问题描述】:

我有相同的功能,唯一的区别是它会增加或减少。我想从中概括一下。

template<typename O>
void f(int& i, O op){
  op(i);
}

int main() {
  int i;
  f(i,operator++);
  f(i,operator--);
  return 0;
}

我怎样才能做到这一点?

我的另一个选择是使用功能性 std::plus 或具有两个功能,但如果可能的话,我更喜欢这个解决方案。谢谢。

【问题讨论】:

  • 写你自己的函子。 (如果你只写operator++就可以做到这一点,就不需要std::plus...)
  • 我认为你不能为原生类型做到这一点。
  • f(i,[](int &amp; v) { ++v; });
  • @cdhowie 如果我们能做到f(i, x =&gt; x++);,那该多好
  • @cdhowie s/int/auto/,并且可能还想返回一些东西:)

标签: c++ function argument-passing pre-increment


【解决方案1】:

在你给出的用例中,typename O 是一个没有状态的一元函数,可以用一个简单的函数指针来建模:

#include <iostream>

int& increment(int& i) {
    ++i;
    return i;
}

int& decrement(int& i) {
    --i;
    return i;
}

template<typename O>
void f(int& i, O op){
    op(i);
}

using namespace std;

int main()
{
    int i = 0;
    f(i, increment);
    cout << i << endl;

    f(i, decrement);
    cout << i << endl;
    return 0;
}

输出:

1
0

【讨论】:

    【解决方案2】:

    只需使用 lambda:

    template<typename O>
    void f(int& i, O op){
      op(i);
    }
    
    int main() {
      int i;
      f(i,[] (int& x) { ++x; });
      f(i,[] (int& x) { --x; });
      return 0;
    }
    

    还不清楚您是想要后增量还是前增量。

    正如@T.C. 所指出的。如果你想保持普通运算符的语义,你可以添加 return 语句。

    【讨论】:

      【解决方案3】:

      这里有一个选项(有很多可能的解决方案)也适用于 C++11 之前的版本:

      enum OpType { increment, decrement };
      
      template <OpType op> void f(int &i);
      template<> void f<increment>(int &i) { ++i; }
      template<> void f<decrement>(int &i) { --i; }
      

      用法:

      f<increment>(i);
      

      为了让你的代码库保持整洁,你可能想要使用一些范围,所以要么使用 C++11 中的范围枚举,要么使用命名空间。

      【讨论】:

        猜你喜欢
        • 2011-02-16
        • 2021-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-03
        • 2014-03-21
        • 1970-01-01
        相关资源
        最近更新 更多