gpt4 book ai didi

c++ - 检查基类中派生模板类的相等性

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:59:01 28 4
gpt4 key购买 nike

这是我在这个平台上的第一个问题。如果有什么不清楚的地方或者我没有以适当的方式提问,我很抱歉。

下面的代码应该可以用任何 C++11 编译器编译。我试图将它减少到最低限度。在此过程中这段代码的意义可能会丢失,但应该仍然清楚我正在尝试保留类列表和相应的成员函数以使用相同的参数调用它们:

#include <iostream>

class Base {
public:
virtual void Call(int x) = 0;
};

template<class T> class Extended : public Base
{
public:
// Constructor.
Extended(T* ptr, void (T::*memberFunction)(int)) : _ptr(ptr), _memberFunction(memberFunction) { }

// Call function.
void Call(int x) {
(_ptr->*_memberFunction)(x);
}

private:
// Pointer to class T.
T* _ptr;

// Function pointer.
void (T::*_memberFunction)(int);

};

class Test1 {
public:
void Fun1(int x) { std::cout << "Hello " << x << std::endl; }
};

class Test2 {
public:
void FunX(int x) { std::cout << (x * 2) << std::endl; }
};

class MyList {

public:
~MyList() {
for (auto it = _list.begin(); it != _list.end(); ++it) {
delete (*it);
}
}

template <class T> void Add(T* t, void (T::*memberFunction)(int)) {
_list.push_back(new Extended<T>(t, memberFunction));
}

void CallAll(int g) {
for (auto it = _list.begin(); it != _list.end(); ++it) {
(*it)->Call(g);
}
}

private:
std::list<Base*> _list;
};


int main() {
MyList myList;
Test1 test1;
Test2 test2;
myList.Add(&test1, &Test1::Fun1);
myList.Add(&test2, &Test2::FunX);
myList.CallAll(100);
}

这很完美。我的问题是我不知道如何从列表中删除类和成员函数。此外,我不希望同一个类和成员函数被调用两次,这实际上是同一个问题。我需要检查两个 Base 类型的类是否相等。我可以提供一个虚函数,它给我一个 void 指针。

virtual void* GetPtr() = 0;

但这只会检查类的相等性。我不知道如何检查此类的函数指针是否相等以及如何检查

template <class T> void MyList::Remove(T* t, void (T::*memberFunction)(int)) {

}

必须看起来像。

有人知道问题的解决方案吗?或者这个检查是不可能的?

最佳答案

向 Base 添加虚拟 isEqual 方法。

class Base {
public:
virtual void Call(int x) = 0;
virtual bool isEqual(const Base& other) = 0;
};

template<class T> class Extended : public Base
{

public:
virtual bool isEqual(const Base& other)
{
const Extended* otherPtr = dynamic_cast<const Extended*>(&other);
return otherPtr != nullptr && otherPtr->_ptr == _ptr && otherPtr->_memberFunction == _memberFunction;
}

};

并在Base中添加虚析构函数,否则内存泄漏,

并且不要在成员变量 _ptr 的开头使用 undescore - 如果你必须在末尾使用:ptr_。一些前导下划线是为编译器保留的。

关于c++ - 检查基类中派生模板类的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12873279/

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