如何在std :: function中使用多态?

时间:2013-08-11 14:53:16

标签: function c++11 bind std-function

假设我有两个班级:

class A {}

class B : public A {}

我希望使用std::function接收 A 类型的任何内容,但是为其指定接收来自 A 的类的方法(如的)。

void myFun(B bbbb) {}

std::function<void(A)> blah = std::bind(myFun, _1);

这显然不起作用,因为编译器不会隐式地向下转发。

但我怎么能这样做呢?基本上我想要保存一些基本std :: function类型的映射,并且在每个映射值中它将std::function保存到派生类型,如 B

有没有办法将转换运算符绑定到占位符?

1 个答案:

答案 0 :(得分:4)

好的,我最后刚刚做了一个解决方法 编译器不会让你隐式转发,所以我绑定了一个强制转换方法 因此,为了保持通用和模板,它是这样的:

首先,获取函数参数类型的辅助类:

template <typename T>
class GetFunctionArgumentVal;

template <class T, typename U >
class GetFunctionArgumentVal<std::function<U(T)>>
{
public:
    typedef T arg;
    typedef U returnVal;
};

然后,使用static_cast进行强制转换的强制转换操作符(保持编译时类型安全),然后使用派生类调用该函数:

template <typename FUNCTION, typename BASE>
void castAndCall(FUNCTION bf, BASE& temp) 
{
    bf(static_cast< GetFunctionArgumentVal<FUNCTION>::arg >(temp));
}

用法示例:

class A {};

class B : public A {};

class C : public A {};

void targetB(B& temp) 
{

}

void targetC(C& temp) 
{

}

    std::function<void(A &)> af;
    std::function<void(B &)> bf = targetB;
    std::function<void(C &)> cf = targetC;

    B b;
    C c;

    af = std::bind(castAndCall<decltype(bf),A>,bf,std::placeholders::_1);
    af(b);

    af = std::bind(castAndCall<decltype(cf),A>,cf,std::placeholders::_1);
    af(c);