繁体   English   中英

你可以将任何指针类型或基类传入函数typedef

[英]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);
}

但是你必须记住一些事情:

  • 您传递ClassY对象的地址,而不是ClassY对象本身。 你说你会通过ClassY,这是错误的。
  • 您将参数声明为ClassX* ,因此不能将poitner传递给const(即const ClassY*被禁止)
  • 编译器必须知道 ClassY是从ClassX派生的,因此您必须包含ClassY的定义(标题)。
  • 您调用该函数的代码必须能够访问“派生”属性,因此ClassY应该从ClassX派生公共 (对于nitpickers:是的,有protected ,有friend ,当然继承可以通过多个继承级别间接...)

但是所有这些都不仅适用于std::function ,而是适用于一般的函数。 对于没有(可见和可访问)派生自ClassX的任何其他类,您无法调用该函数。

你不能这样做,因为barmyCaller更具限制性。 你可以走另一条路:

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");
    }

};

现在barmyCaller限制性更myCaller因此可以绑定。

您还可以让barClassX*和dynamic_cast转换为ClassY*并检查是否为NULL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM