base class 的泛型成员函数数组

Array of generic member functions of base class

我想为具有相同签名但 class 不同的成员函数创建一个函数数组。 (但它们是继承的)。我试过这样的事情,我明白为什么它不起作用,但我怎样才能解决这个问题并且仍然能够做到这一点?我不介意例如我传递的对象上是否存在该函数(如果它是另一个 class),因为我有逻辑。

class Base 
{
public:
    virtual void BaseFunc();
};

class X : Base 
{
public:
    void XFunc();
};

class Y : Base
{
public:
    void YFunc();
};
int main()
{
    std::vector<std::function<void(Base*)>> v;
    v.push_back(&Base::BaseFunc); //OK
    v.push_back(&X::XFunc); //NOT OK
    v.push_back(&Y::YFunc); //NOT OK
}

我也试过有一个模板 class,它有一个指向那个 class 的成员函数的指针,然后我会从那个 class 调用,但我不能一个模板化的 class 数组,没有给出模板参数(即使 class 很简单并且大小不依赖于模板参数)。 我也尝试过让数组只包含 void 指针,但我发现不可能将成员函数指针转换为 void 指针。(我可能不正确,所以如果可能的话请告诉我)

编辑:为了提供一些关于我的意图的背景,我将在此处粘贴我的评论:我的想法是让用户在继承基础 class 的 class 中实现功能,然后是能够将这些函数传递给我的 class 然后将它们存储在一个数组中并在指定的特定条件下调用它们。

编辑 2:我需要一个在 c++11 或 c++14 中的解决方案

我认为您需要类似 std::mem_fn() 的东西,但具有转换对象指针的额外灵活性。这应该是直接创建:

template <typename R, typename X>
class open_mem_fun {
    R (X::*fn)();
public:
    open_mem_fun(R (X::*fn)()): fn(fn) {}
    template <typename T>
    R operator()(T* p) const {
        return (dynamic_cast<X&>(*p).*fn)();
    }
};
template <typename R, typename X>
open_mem_fun<R, X> open_mem_fn(R (X::*fn)()) {
    return open_mem_fun<R, X>(fn);
}

生成的对象应该可以通过合适的 std::function 对象调用:

std::function<void(Base*)>(open_mem_fn(&X::XFunc));