gpt4 book ai didi

不同类成员函数指针的C++映射

转载 作者:行者123 更新时间:2023-11-30 01:17:06 31 4
gpt4 key购买 nike

我正在尝试创建一个包含不同类的成员函数指针的映射。成员函数都具有相同的签名。为了做到这一点,我所有的类都继承了一个 Object 类,它只有默认构造函数、虚拟析构函数和一个虚拟 ToString() const 方法。

// The map looks like this
map<Object*, void (Object::*)()> mapOfMethodPointers;

// And here are the two classes that inherit Object
// Class A
class A : public Object
{
public:
void AFunc();

string ToString() const override;
};

void A::AFunc()
{
cout << "AFunc()" << endl;
}

string A::ToString() const
{
cout << "A" << endl;
}

// Class B
class B : public Object
{
public:
void BFunc();

string ToString() const override;
}

void B::BFunc()
{
cout << "BFunc()" << endl;
}

string B::ToString() const
{
cout << "B" << endl;
}

// Here is how add the member function pointers in the map
A a;
B b;

mapOfMethodPointers[*a] = &A::AFunc;
mapOfMethodPointers[*b] = &B::BFunc;

当我在映射中添加两个成员函数指针时,出现以下错误:

  1. 无法将“void (B::*)()”转换为“void (Object::*)()”
  2. 无法将“void (A::*)()”转换为“void (Object::*)()”

尽管 A 类和 B 类都是对象,但我无法进行这种转换。我怎样才能实现这样的目标?我需要成员函数指针的多态性。我选择的实现不起作用。有什么想法吗?

最佳答案

In order to do this all my classes inherit an Object class which only has default constructor, virtual destructor and a virtual ToString() const method.

对于存储具有相似签名的多态函数,这是一个糟糕的解决方案。

这里有两个更好的解决方案:

'1。将您的函数指针实现为基本接口(interface)的特化(在您的情况下为 Object )。然后,在客户端代码中存储接口(interface)本身:

struct Object { virtual void Execute() = 0; }

/// old: map<Object*, void (Object::*)()> mapOfMethodPointers;
/// new:
std::vector<Object*> objects;
objects[10]->Execute(); // execution is agnostic of whichever instance you you use

在此解决方案中,Execute 将解析为 A::Execute,定义如下:

class A : public Object
{
void AFunc();
public:
virtual void Execute() override { AFunc(); }
};

使用此解决方案,您不需要函数映射(因为 Object 的虚拟表 本质上是一个函数映射)。

'2。根据通用函数实现您的函数映射,然后用 lambda 表达式填充它:

代码:

/// old: map<Object*, void (Object::*)()> mapOfMethodPointers;
/// new:
map<Object*, std::function<void()>> mapOfMethodPointers;

// filling the map:
class A // not needed: public Object
{
public:
void AFunc(); // this is our interesting function

string ToString() const override;
};

A obj;
mapOfMethodPointers[&obj] = [&obj]() { obj.AFunc(); };

关于不同类成员函数指针的C++映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25265397/

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