基类的通用成员函数数组

时间:2017-12-20 20:10:49

标签: c++ member-function-pointers

我想为具有相同签名但具有不同类的成员函数创建一个函数数组。 (但它们是遗传的)。我尝试了类似的东西,我理解为什么它不起作用,但我怎么能解决这个问题并且仍然可以做到这一点?我不介意,例如函数不存在于我传递的对象(如果它是另一个类),因为我有逻辑。

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
}

我还尝试过一个模板类,它有一个指向该类成员函数的指针,然后我会从该类调用,但我不能给出一个模板化类的数组而不给出模板参数(甚至如果类很简单,并且大小不依赖于模板参数)。 我也尝试过只使用void指针的数组,但我发现将成员函数指针转换为void指针是不可能的。(我可能不对,所以如果有可能请告诉我)

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

编辑2:我需要一个c ++ 11或c ++ 14

的解决方案

1 个答案:

答案 0 :(得分:2)

我认为你需要类似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));