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

Passing increment/decrement operator to a function

本文关键字:函数 运算符      更新时间:2023-10-16

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

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

我怎样才能做到这一点?

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

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

这里有一个选项(有许多可能的解决方案(,也可以在 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 中使用作用域枚举或命名空间。

在您给出的用例中,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