c++ - C 委托(delegate)给 C++

标签 c++ delegates

我在使用从 CMOS 相机获取图像的库时遇到了一个小问题。 该库允许使用流功能,并且我可以在获取图像、删除图像以及出现错误时设置三个访问点(三个委托(delegate))。

typedef void(* StreamCallbackPtr)( IMAGE *image );
typedef void(* StreamErrorCallbackPtr)();
typedef void(* StreamFrameDroppedCallbackPtr)();

int Stream_Start( DEVICE device, IMAGEFORMAT format, StreamCallbackPtr  stream_callback, StreamFrameDroppedCallbackPtr  f_dropped_callback, StreamErrorCallbackPtr  error_callback );

一旦相机上的图像准备就绪,我就会输入 StreamCallbackPtr,但请记住,我没有任何方法来更改库代码。

问题是:如何在 C++ 中插入我自己的委托(delegate)? 假设我在类中使用此流功能,我知道我至少有两个选择;包装器和全局变量。第一个似乎受到了损害,因为除了 IMAGE 之外我无法传递任何其他内容,并且我想避免使用全局变量(在本例中它将是静态成员)。

有什么想法吗?

最佳答案

您可以使用静态成员函数作为StreamCallbackPtr,然后它可以访问希望接收消息的 C++ 委托(delegate)的私有(private)静态引用或引用列表。

这样你就隐藏了大部分细节,作为类的私有(private)信息。

下面的代码是伪 C++(我没有正确检查过),但它应该能让您了解我的建议。

class Delegate
{
protected:
    void Callback( IMAGE *image ) = 0;
    void Error() = 0;
    void FrameDropped() = 0;

public:
    static void SetDelegate(Delegate* d) { delegateInstance = d; }   

    static void StaticCallback( IMAGE *image)
    {   
        // Invoke the delegate instance
        if (delegateInstance != nullptr) delegateInstance->Callback(); 
    }   
    // Same for the others...

private:
    static Delegate* delegateInstance = nullptr;
};

class MyClass : public Delegate
{
protected:
    void Callback( IMAGE *image )
    {   
        // Now the callback is in a delegate instance
    }   
};

int main(void)
{
    MyClass mc; 
    Delegate::SetDelegate(&mc);

    StreamCallbackPtr scp = &Delegate::StaticCallback;
    // Register the other static callbacks...

    return 0;
}

关于c++ - C 委托(delegate)给 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18130905/

相关文章:

iphone - 是否为 Core Data 的获取结果 Controller 实现委托(delegate)

C++ 使用 std::function 和 std::bind 不调用函数委托(delegate)给成员函数

c# - 何时使用委托(delegate)而不是接口(interface)

c++ - 要调用的函数列表。必须有相同的签名。更好的实现?

c# - 将通用 Action<T> 委托(delegate)添加到列表

c++ - 非托管 C++ 程序集的加载顺序(特别是 VS C++ 2015 可再发行组件和通用 CRT)

c++ - 如何在 M 个 bool 值数组中分配 N 个规则间隔的 bool 值?

c++ - 实现部分写入压缩数据的存储编写器

c++ - qt在图形 View 中获取鼠标相对于图像的单击位置

c++ - 将 C++ 字符串映射到枚举以获取用户输入