我有两个变量和一个运算符(可以是+, - ,/,比较......).编写一个带有2个参数和运算符作为参数的函数是一个好主意吗?
功能可能如下所示
T foo(int a,int b, sometype(not sure) operator)
Run Code Online (Sandbox Code Playgroud)
然后从中创建一个字符串
foo(a,b,+);
as a+b
Run Code Online (Sandbox Code Playgroud)
这是一个好方法还是有其他方法吗?
Bau*_*gen 11
你不能.操作员很特别,他们不是普通的职能.(例如,如果所有操作数都是内置类型,则运算符可以进行短路评估并且没有重载决策.函数不能这样做.)
传递二进制操作对象,如:
template <class BinaryOp>
int fun(int, int, BinaryOP);
Run Code Online (Sandbox Code Playgroud)
然后你可以传递像std::plus<>二元lambdas †的实例那样的函子 作为第三个参数.这是C++中的常见做法.
请注意,包含内置运算符的仿函数(如前面提到的)std::plus在标题中很容易获得<functional>.
示例代码供参考:
#include <iostream>
#include <functional>
template <class T>
void fun (int i, int j, T t) {
std::cout << t(i,j) << "\n";
}
int main () {
fun(1,2,std::plus<>{}); // Or std::plus<int>{} in C++11
fun(1,2,[](auto i, auto j){return i * j;}); // Again, with explicit types for C++11
}
Run Code Online (Sandbox Code Playgroud)
这将打印
3
2
Run Code Online (Sandbox Code Playgroud)
†因为这是标记的C++ 11:std::plus<T=void>本答案中使用的仿函数等在C++ 14及更高版本中可用.在C++ 11中,您需要提供类似的模板参数std::plus<int>.同样适用于需要成为的lambda [](int i, int j){...}.