将递增/递减运算符传递给函数

时间:2014-12-17 21:16:40

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

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

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或有两个功能,但如果可能的话,我更喜欢这个解决方案。谢谢。

3 个答案:

答案 0 :(得分:6)

只需使用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语句。

答案 1 :(得分:1)

这是一个选项(有许多可能的解决方案),它们也适用于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中使用作用域枚举,要么使用命名空间。

答案 2 :(得分: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