在C++中将运算符作为参数发送

use*_*825 3 c++ c++11

我有两个变量和一个运算符(可以是+, - ,/,比较......).编写一个带有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){...}.