gpt4 book ai didi

c++ - 调用派生类的函数调用操作符时避免使用指针

转载 作者:行者123 更新时间:2023-11-30 02:04:34 24 4
gpt4 key购买 nike

我有一个关于函数对象继承的问题。

我想这一定在 Stack Overflow 上被问了无数次,但是措辞相似的问题数量之多让我几乎不可能找到任何东西。

假设我有一个基本抽象类:

class BinaryOperation
{
public:
virtual int operator()(int a, int b) = 0;
};

从中派生出两个新类:

class Plus : public BinaryOperation
{
public:
virtual int operator()(int a, int b)
{
return a + b;
};
};

class Minus : public BinaryOperation
{
public:
virtual int operator()(int a, int b)
{
return a - b;
};
};

我想使用 std::map 将字符串映射到派生自同一类的各种仿函数:

我的第一个方法是

std::map<std::string, BinaryOperation> operator_map;
operator_map["+"] = Plus();
operator_map["-"] = Minus();

operator_map["-"](5, 2);

显然这行不通,因为我们无法实例化抽象类。

如果我使用指向基类的指针,它工作得很好,但看起来比较笨拙,因为我们必须 new 使它更容易发生内存泄漏的对象(我们必须手动 删除对象)

std::map<std::string, BinaryOperation*> operator_map;

operator_map["+"] = new Plus();
operator_map["-"] = new Minus();

std::cout << (*operator_map["-"])(5, 2)

在不牺牲 RAII 优势的情况下实现此功能的首选方法是什么?

最佳答案

只需制作 std::string 的 map 即可至 std::function<int(int, int)> .这允许您取消任何公共(public)基类,因为函数对象提供了多态性:

struct Plus {
int operator()(int a, int b) const{ return a+b; }
};

struct Minus {
int operator()(int a, int b) const{ return a-b; }
};

int main()
{
std::map<std::string, std::function<int(int,int)>> opMap;
using namespace std::placeholders;

opMap["-"] = Minus();
opMap["+"] = Plus();

std::cout << opMap["-"](5,2) << std::endl;
std::cout << opMap["+"](5,6) << std::endl;
}

请注意,标准库提供了在 functional header 中实现算术运算的仿函数。 , 所以你不必实现 MinusPlus你自己:

opMap["-"] = std::minus<int>();
opMap["+"] = std::plus<int>();

关于c++ - 调用派生类的函数调用操作符时避免使用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10440521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com