首页 > 解决方案 > 在基类中存储指向派生类函数的指针

问题描述

我想创建一个方法,它将指向对象schedule_function成员函数的指针保存到 a 中,但没有在的父类中定义所述函数,. 现在我正在使用这种方法,它可以很好地保存函数,但不适用于函数:BasicAlgoScheduledEventBasicAlgoStrategyStrategyBasicAlgo

class Strategy {

schedule_function(void (Strategy::*func)()) {
    // Puts the scheduled event built with the strategy function onto a list
    heap_eventlist.emplace_back(std::make_unique<events::ScheduledEvent>(func));
}}

我尝试替换Strategy::*func为,Strategy*::*func但这会导致编译器错误,并且似乎不正确。

有没有办法将派生类的成员函数的指针作为基类BaseAlgo的参数,而不在中定义函数?StrategyStrategy

标签: c++pointersinheritancepolymorphismmember

解决方案


您无法将成员函数存储BaseAlgo在指向成员函数的指针中Strategy

可以将 的成员函数存储BaseAlgo在指向 的成员函数的指针中BaseAlgo,并且可以将此类指针类型与 CRTP 一起使用:

template<class T>
struct Strategy {
    void schedule_function(void (T::*func)());
};

struct BasicAlgo : Strategy<BasicAlgo> {
    void memfun();
};

int main() {
    BasicAlgo b;
    b.schedule_function(&BasicAlgo::memfun);
}

否则,您可以使用类型擦除函数包装器std::function代替函数指针。


推荐阅读