gpt4 book ai didi

C++ 操作模板对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:26 25 4
gpt4 key购买 nike

我有课

class BarBase {

};

和一个派生模板类,其中存储了指向成员函数的指针和指向同一类对象的指针

template<typename TypeName> class Bar: public BarBase
{
void ( TypeName::*action ) ( void );
TypeName* object;
};

我创建了 Bar 的实例并将指向它们的指针存储在另一个类 Foo 的 vector 中

class Foo {
private:
vector<BarBase*> myBars;
...
};

现在进入问题。 Foo 有一个模板函数

template <typename TypeName>
void Foo::foo( TypeName* object , void ( TypeName::*action ) ( void ) )

在这个函数中,如何在 myBars 中找到字段 objectaction 等于此函数参数的元素?如您所见,我无法直接访问像 this->myBars[i]->action 这样的字段,因为这些字段不是(也不可能是)BarBase 的成员>.

编辑我确实可以比较 object。我将 virtual size_t getObject (){}; 添加到 BarBase 并在 Bar 中覆盖它,例如 virtual size_t getObject (){ return (size_t)this->对象; };。然后我比较两个 size_t ,但我不知道如何将 action 转换为数字...

最佳答案

最简单的解决方案是使基类多态,并使用dynamic_cast 来确定它是否具有预期的类型:

class BarBase {
public:
virtual ~BarBase() {} // virtual function required for polymorphism
};

Bar<TypeName>* bar = dynamic_cast<Bar<TypeName>*>(myBars[i]);
if (bar && bar->object == object && bar->action == action) {
// it's a match
}

这确实增加了一些开销来支持 RTTI;在我的脑海中,我想不出任何明确定义的方法来做到这一点,而且不会增加开销。

关于C++ 操作模板对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12178280/

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