我有一个关于函数对象继承的问题。
我想这一定是在 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
使其更容易发生内存泄漏delete
的对象(我们必须手动处理对象)
std::map<std::string, BinaryOperation*> operator_map;
operator_map["+"] = new Plus();
operator_map["-"] = new Minus();
std::cout << (*operator_map["-"])(5, 2)
在不牺牲 RAII 优势的情况下实现此功能的首选方式是什么?