【问题标题】:can you pass in any pointer type or base class into a function typedef您可以将任何指针类型或基类传递给函数 typedef
【发布时间】:2013-03-14 12:08:15
【问题描述】:

我有这个代码

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 采用扩展 ClassX 而不是 ClassX 的 ClassY。

我得到编译时错误: main.cpp:22:9: 没有匹配的成员函数调用'createCaller'

问题是我将如何允许 bar 获取任何扩展 ClassX 的类或任何类的参数?有可能吗?

【问题讨论】:

  • 向我们展示您的继承层次结构和您收到的确切错误。
  • 是的。查看mc - 根据定义,它必须是一个函数对象,接受ClassX*。但是 bar 只接受 ClassY* - 所以 mc 不能将所有可能的参数委托给 bar

标签: c++ std typedef std-function


【解决方案1】:

您不能这样做,因为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 限制更少,因此可以绑定。

您还可以让bar 获取ClassX* 并将其动态转换为ClassY* 并检查NULL。

【讨论】:

  • 是的,我一直在进行动态转换,但希望有一些新的花哨的 c++ 11 功能使其成为可能。可能不会。谢谢 :)
【解决方案2】:

对于 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*,因此不能将指针传递给 const(即禁止使用 const ClassY*
  • 编译器必须知道 ClassY 是从 ClassX 派生的,因此您必须包含 ClassY 的定义(标头)。
  • 调用函数的代码必须能够访问“派生”属性,因此 ClassY 应该从 ClassX 派生 public(对于挑剔者:是的,有 protected,还有 @987654325 @ 当然可以通过多级继承间接继承...)

但所有这些不仅适用于std::function,还适用于一般的函数。 对于任何其他不(可见和可访问)从 ClassX 派生的类,您不能调用该函数。

【讨论】:

  • 添加了更多细节以尝试澄清我的问题
猜你喜欢
  • 2018-02-06
  • 2013-09-09
  • 2023-04-07
  • 2019-11-01
  • 2014-04-18
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多