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