c++ - 如何分配子类的方法成员指针?

标签 c++ templates subclass pointer-to-member mem-fun

我的问题有点复杂。 我有一个类(e:Component),它有 Ports 对象。 当 Component 创建 Port 对象时,它会将其方法之一传递给 Port 构造函数。

方法签名:

typedef std::vector<std::string> (Component::*ComponentMethod)(std::vector<std::string>);

如果我这样做,它工作正常:

// in class Component

std::vector<std::string> Component::test_method( std::vector<std::string> ) {
    std::cout << "Hello !\n";
    // Do stuff
}

// Port ctor : Port( ComponentMethod callback );
Port* p = new Port(&Component::test_method);

嗯...现在,我的问题是我创建了 Component 类的子类,但我不知道如何将子类方法传递给 Port。

// in class SubtypeComponent

std::vector<std::string> SubtypeComponent::test_method2( std::vector<std::string> ) {
    std::cout << "Hello !\n";
    // Do stuff
}

// Port ctor : Port( ComponentMethod callback );
Port* p = new Port(&SubtypeComponent::test_method2);
// ERROR :'(

这看起来很正常:我猜编译器恰好期望 Component(仅)方法。

--> 我正在寻找一种在 Ports 中“动态”分配方法的解决方案(但我认为这是不可能的)

--> 也许另一个解决方案应该是使用模板? (定义“模板方法指针”而不是“组件方法指针”),但我不确定。

任何帮助将不胜感激:)

最佳答案

指针到成员的转换一开始有点反直觉。指向基成员的指向成员的指针可以隐式转换为指向派生类型的指向成员的指针(反方差),但反之则不然。

如果你真的仔细想想,它确实是有道理的:如果你有一个指向 base 成员的指针,它可以应用于派生类型,因为它保证有一个 base 子对象。相反,指向派生类型成员的指针可能指向基类型中不存在的成员,因此转换没有意义。

这是您必须解决的设计中的问题,如果您想要保存指向基类型的成员指针,则指针必须引用基中存在的成员(在在这种情况下,表达式 &derived::member 的类型为 T base::* 并且无需转换)并且它们之前不得存储在指针中- to-member of derived type(存入后,编译器无法知道指针指向的是base的成员还是derived的成员)

关于c++ - 如何分配子类的方法成员指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13553514/

相关文章:

c++ - 关于 reference_wrapper 和可调用对象

C++关于返回值优化的问题

c++ - 可以将一个空插入另一个集合吗?

c++ - 可以在 C++ 模板中强制使用连续的分配边界吗?

ios子类替代方案

ios - 子类未找到父类(super class)接口(interface)的 Objective-c 错误

c++ - 模板 C++ 中的实现映射出错

c++ - 可组合的 monadic lambda/std::function with std::optional

c++ - 如何在构造函数中为不同的类使用模板化类

java - java中子类的实例化