4

假设我有 2 个课程:

class A {}

class B : public A {}

而且我想使用std::function接收A类型的任何东西,但分配给它接收从A继承的类的方法(如B)。

void myFun(B bbbb) {}

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

这显然是行不通的,因为编译器不会隐式地向下转换。

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

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

4

1 回答 1

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);
于 2013-08-12T07:18:29.897 回答