C++ 操作模板对象

标签 c++ templates pointers compare

我有课

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/

相关文章:

c++ - 衰减到基类

C 库调用用户代码(函数指针与外部符号)

c++ - #include .h 或 .cpp 文件?

c++ - 如何将静态库(SOIL)链接到 visual studio 2010 中的项目?

c++ - Qt 重绘 paintEvent 已调用但小部件未更新

php - 将自定义类别添加到愿望 list 顶部链接

c++ - 类模板的别名

c - 如何将二维数组的引用作为参数传递

c++ - BST 不添加元素

c++ - 被调用类中的 OpenMP 临界区(不同于并行循环)