将递增/递减运算符传递给函数
Passing increment/decrement operator to a function
我有相同的函数,唯一的区别是它会递增或递减。我想从中概括一下。
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
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载运算符new[]的行为取决于析构函数
- 构造函数和转换运算符之间的重载解析
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 是什么让一些命名函数/运算符与众不同?
- 删除了所有自动生成的构造函数/运算符的类仍然可以从函数返回吗
- 如何在局部类中定义友元函数运算符>>?
- 隐式转换和函数运算符
- 如何从函数运算符(x,y)返回向量元素的引用
- C++/析构函数-运算符删除
- 获取函数运算符<未定义的引用
- VS2012 std::函数运算符 bool 意外返回 true
- "Polymorphic"非成员函数/运算符,是否需要额外的重载?
- Xcode - 控制到达非无效函数运算符错误的末尾
- 重载类函数运算符兼任二传手和吸气手
- 为简单结构定义哪个复制/移动构造函数/运算符
- 关于函数/运算符重载的困惑
- 函数运算符上的未定义引用>>
- C++ 重载函数运算符和继承,无法在子类函数中正确使用它
- 如何使用另一个类的重载函数运算符(operator())