我有相同的功能,唯一的区别是它会递增或递减。我想从中概括一下。
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或有两个功能,但如果可能的话,我更喜欢这个解决方案。谢谢。
答案 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