基类的通用成员函数数组

问题描述 投票:-1回答:1

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

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的解决方案

c++ member-function-pointers
1个回答
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));
© www.soinside.com 2019 - 2024. All rights reserved.