假设我有两个班级:
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 。
有没有办法将转换运算符绑定到占位符?
答案 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);