代码之家  ›  专栏  ›  技术社区  ›  aleksk

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

  •  0
  • aleksk  · 技术社区  · 6 年前

    在下面的代码中,我希望用户能够创建具有特定类型的consumer类,例如 Consumer<StateA> StateB 未生成消费方法。consume方法来自基类,必须重写它们。

    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 回复  |  直到 6 年前
        1
  •  2
  •   max66    6 年前

    consume_h() (“消费助手”)方法。

    T (类的模板类型)调用回调函数

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

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

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

    消耗\u h()

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

    这种方式对应于虚拟方法 T ,致电 消耗\u h() 消耗\u 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
    }