繁体   English   中英

具有动态回调函数类型的C ++模板类

C++ template class with dynamic callback function type

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

在下面的代码中,我希望用户能够创建具有特定类型的使用者类,例如Consumer<StateA>以便他们的回调函数可以正确处理为其提供的类型。 但是,在下面的代码中,编译器会抱怨,因为在编译时,不会生成对StateB消耗方法中的函数的调用。 消费方法来自基类,必须重写它们。

template <class T>
class Consumer : ConsumerBase
{
    public:
        Consumer(std::function<void(T&)> _callback){
            callback = _callback;
        }
        virtual void consume(StateA& state) { 
            callback(state);
        }
        virtual void consume(StateB& state) { 
            callback(state);
        }
    private:
        std::function<void(T&)> callback; 
};

基类:

class ConsumerBase
{
   public:
      virtual void consume(StateA& state) = 0;
      virtual void consume(StateB& state) = 0;
};

我该如何进行这项工作?

1 个回复

消费方法来自基类,必须重写它们。 [...]我该如何工作?

我想一个可能的解决方案是开发几个consume_h() (“消费助手”)方法。

第一个与调用回调函数的T (类的模板类型)完全匹配

    void consume_h (T & state)
     { callback(state); }

第二个是不做任何事情的模板版本

    template <typename U>
    void consume_h (U &)
     { }

现在,您可以覆盖调用consume_h()两个虚拟方法。

    virtual void consume (StateA & state)
     { consume_h(state); }

    virtual void consume (StateB & state)
     { consume_h(state); }

这样,对应于T的虚拟方法调用了调用回调的consume_h() 另一个调用consume_h()的模板consume_h()

以下是完整的编译示例

#include <functional>

struct StateA { };
struct StateB { };

struct ConsumerBase
 {
   virtual void consume (StateA &) = 0;
   virtual void consume (StateB &) = 0;
 };

template <typename T>
class Consumer : ConsumerBase
{
    public:
        Consumer (std::function<void(T&)> cb0) : callback{cb0}
         { }

        void consume_h (T & state)
         { callback(state); }

        template <typename U>
        void consume_h (U &)
         { }

        virtual void consume (StateA & state)
         { consume_h(state); }

        virtual void consume (StateB & state)
         { consume_h(state); }

    private:
        std::function<void(T&)> callback; 
};

int main()
{
   Consumer<StateA>  csa{[](StateA &){ std::cout << "A" << std::endl; }};
   Consumer<StateB>  csb{[](StateB &){ std::cout << "B" << std::endl; }};

   StateA  sa;
   StateB  sb;

   csa.consume(sa);  // print A
   csb.consume(sb);  // print B
}
1 具有回调函数的C ++模板类

即使我阅读了很多有关模板的内容,但这还是我第一次尝试实际使用它们。 因此,我的问题可能只是缺少对模板的理解。 我有一个应该独立且定期生成一些数据的类。 当有新数据时,它将通过回调函数调用父级并发送数据。 该类应该是可移植的,因此是模板化的父类。 但是,如果我在数据类上使用模板, ...

2 c ++ CALLBACK函数类型

我正在尝试在Win32中创建类似MsgProc东西。 当他们声明MsgProc函数时,它们之前有CALLBACK类型。 所以,我正在尝试创建自己的messsage函数,调用我的函数来处理消息。 消息发送和处理时基本相同。 我的问题是如何创建相同的流程? 一个例子就是很棒。 ...

4 模板类的 C++ 成员函数的自动返回类型

为了可读性,我将我的问题简化为一个很好的玩具示例: 假设我有一个模板类Box ,它可以保存给定类型(初始化为Box&lt;double, 10&gt; )的有限对象集合。 该类有一个名为expand(n)的成员函数,它应该修改框以使其容量更高。 由于10是类实例的规范,我认为该方法返回一个新对象是 ...

5 c ++模板类; 具有任意容器类型的函数,如何定义它?

好的,简单的模板问题。 假设我将模板类定义为: 问题是关于我的bar函数...我需要它能够使用某种标准容器,这就是为什么我包含模板/ typename C部分来定义容器类型。 但显然这不是正确的方法,因为我的测试类然后抱怨: 错误:此范围内未声明“bar” 那么我将如何以 ...

7 c ++决定动态模板类型

在模板函数内部,有什么方法可以告诉我正在使用的模板的类型。 我想做如下事情: 例如: IntObject 和 StringObject 只是两种不同的类型。 如果按如下方式应用此功能: 我想构造一个 IntObject 的实例 具体代码如下: ...

8 c ++继承以此类作为类型的类模板

我希望我的班级模板A能够有一个仅在B中定义的成员,而B继承A。 这是理论上可以运行但无法编译的代码。 此代码无法在MSVCP 2010上编译,错误为“'member':不是'B'的成员” 我该如何解决? ...

9 C ++:创建正确类型的回调函数

我正在使用由制造商提供的dll在包装器中使用python中的硬件组件。 DLL带有标头和lib文件,因此很容易包含dll。 据我了解,通过调用open函数(给一些初始参数一个回调函数和一些其他用户数据)来使用组件,然后调用start方法。 接下来,该组件将通过调用回调函数来传递数据。 ...

10 C ++中的回调模板

我正在设计一个类来接收c ++中的回调。 到目前为止,这是我的代码: 这段代码有效,但是现在我想要更多的灵活性。 如您所见,这对于使用至少一个类型为P *的参数定义的方法有效。 我想要一个类来管理变量的可变列表。 这里的一个限制是我不能使用C ++ 11,因为我必须使用gcc 4 ...

暂无
暂无

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

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