[英]can you pass in any pointer type or base class into a function typedef
我有这个代码
class ClassX {};
class ClassY : public ClassX {};
typedef std::function<void (ClassX*)> myCaller;
class Foo {
Foo()
{
createCaller(this, &Foo::bar); //line 22 with the error
}
template <typename Class>
void createCaller(Class *obj, void (Class::*func)(ClassX*))
{
myCaller mc = std::bind(func, obj, std::placeholders::_1);;
}
void bar(ClassY* x)
{
printf("fooBrr");
}
};
它工作正常,直到bar采用ClassY扩展ClassX而不是ClassX。
我得到编译时错误:main.cpp:22:9:没有匹配的成员函数来调用'createCaller'
问题是我将如何允许bar获取任何扩展ClassX或任何类的类的参数? 它甚至可能吗?
对于ClassY和其他派生类,可以轻松地:
#include <functional>
class ClassX {};
class ClassY : public ClassX {};
typedef std::function<void (ClassX*)> myCaller;
int main()
{
myCaller f = [](ClassX*){};
ClassY classY;
f(&classY);
}
但是你必须记住一些事情:
ClassX*
,因此不能将poitner传递给const(即const ClassY*
被禁止) protected
,有friend
,当然继承可以通过多个继承级别间接...) 但是所有这些都不仅适用于std::function
,而是适用于一般的函数。 对于没有(可见和可访问)派生自ClassX的任何其他类,您无法调用该函数。
你不能这样做,因为bar
比myCaller
更具限制性。 你可以走另一条路:
class ClassX {};
class ClassY : public ClassX {};
typedef std::function<void (ClassY*)> myCaller;
class Foo {
Foo()
{
createCaller(this, &Foo::bar); //line 22 with the error
}
template <typename Class>
void createCaller(Class *obj, void (Class::*func)(ClassX*))
{
myCaller mc = std::bind(func, obj, std::placeholders::_1);
}
void bar(ClassX* x)
{
printf("fooBrr");
}
};
现在bar
比myCaller
限制性更myCaller
因此可以绑定。
您还可以让bar
将ClassX*
和dynamic_cast转换为ClassY*
并检查是否为NULL。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.