高级类功能和C ++标准库,一些关于示例的问题

时间:2017-07-03 10:05:16

标签: c++ class signals-slots

我无法理解c ++的一些高级功能。 我试图编码我自己的信号/插槽系统,发现exaple并遇到一些问题:

  • Signal() : current_id_(0) {} - 它是某种派生类吗? 0在这里意味着什么?
  • int connect_member(T *inst, void (T::*func)(Args...)) { - “T ::”在这做什么?
  • mutable std::map<int, std::function<void(Args...)>> slots_; - 当“slots_”被调用时会发生什么?

    在这个例子中。

    #ifndef SIGNAL_HPP
    #define SIGNAL_HPP
    
    #include <functional>
    #include <map>
    
    // A signal object may call multiple slots with the
    // same signature. You can connect functions to the signal
    // which will be called when the emit() method on the
    // signal object is invoked. Any argument passed to emit()
    // will be passed to the given functions.
    
    template <typename... Args>
    class Signal {
    
     public:
    
      Signal() : current_id_(0) {}
    
      // copy creates new signal
      Signal(Signal const& other) : current_id_(0) {}
    
      // connects a member function to this Signal
      template <typename T>
      int connect_member(T *inst, void (T::*func)(Args...)) {
        return connect([=](Args... args) { 
          (inst->*func)(args...); 
        });
      }
    
      // connects a const member function to this Signal
      template <typename T>
      int connect_member(T *inst, void (T::*func)(Args...) const) {
        return connect([=](Args... args) {
          (inst->*func)(args...); 
        });
      }
    
      // connects a std::function to the signal. The returned
      // value can be used to disconnect the function again
      int connect(std::function<void(Args...)> const& slot) const {
        slots_.insert(std::make_pair(++current_id_, slot));
        return current_id_;
      }
    
      // disconnects a previously connected function
      void disconnect(int id) const {
        slots_.erase(id);
      }
    
      // disconnects all previously connected functions
      void disconnect_all() const {
        slots_.clear();
      }
    
      // calls all connected functions
      void emit(Args... p) {
        for(auto it : slots_) {
          it.second(p...);
        }
      }
    
      // assignment creates new Signal
      Signal& operator=(Signal const& other) {
        disconnect_all();
      }
    
     private:
      mutable std::map<int, std::function<void(Args...)>> slots_;
      mutable int current_id_;
    };
    
    #endif /* SIGNAL_HPP */
    

    如何调用它以便我可以自己寻找。 我找到了过于复杂的例子吗?

感谢。

1 个答案:

答案 0 :(得分:1)

按顺序提出问题:

  • Signal() : current_id_(0) {}

这是Signal构造函数中的初始化列表。它告诉编译器在使用该c {#p>构造current_id_对象时,应将Signal初始化为0。

  • int connect_member(T *inst, void (T::*func)(Args...)) {

T::是范围解析,T::*专门指成员函数。函数调用connect_member期望接收指向T的指针,然后是指向成员函数的指针 - T(它接受未指定的参数并且不返回任何内容)< / p>

  • mutable std::map<int, std::function<void(Args...)>> slots_;

slots_Signal的数据成员,类型为map,从整数到函数返回void。 mutable关键字告诉编译器即使拥有slots_Signalconst也可以更改(例如,在成员函数内声明{ {1}})。