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