高级 class 功能和 C++ 标准库,关于示例的一些问题
Advanced class features and C++ standard libraries, some questions about example
我无法理解 C++ 的一些高级功能。
我正在尝试编写我自己的 signals/slots 系统,发现示例和 运行 进入一些问题:
Signal() : current_id_(0) {}
- 它是某种派生的 class 吗?这里的 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 */
它是怎么叫的,所以我可以自己找。
我找到过于复杂的示例了吗?
谢谢。
按顺序回答您的问题:
Signal() : current_id_(0) {}
这是 Signal
构造函数中的初始化列表。它告诉编译器当使用那个 c'tor 构造 Signal
对象时,current_id_
应该初始化为 0。
int connect_member(T *inst, void (T::*func)(Args...)) {
T::
是scope-resolution,T::*
特指成员函数。函数调用 connect_member
期望收到一个指向-T
的指针,然后是一个指向-T
成员函数的指针(它采用未指定的参数和 returns 没什么)
mutable std::map<int, std::function<void(Args...)>> slots_;
slots_
是 Signal
的数据成员,类型 map
从整数到函数返回空值。 mutable
关键字告诉编译器可以更改 slots_
即使拥有的 Signal
是 const
(例如,在声明为 const
的成员函数中) ).
我无法理解 C++ 的一些高级功能。 我正在尝试编写我自己的 signals/slots 系统,发现示例和 运行 进入一些问题:
Signal() : current_id_(0) {}
- 它是某种派生的 class 吗?这里的 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 */
它是怎么叫的,所以我可以自己找。 我找到过于复杂的示例了吗?
谢谢。
按顺序回答您的问题:
Signal() : current_id_(0) {}
这是 Signal
构造函数中的初始化列表。它告诉编译器当使用那个 c'tor 构造 Signal
对象时,current_id_
应该初始化为 0。
int connect_member(T *inst, void (T::*func)(Args...)) {
T::
是scope-resolution,T::*
特指成员函数。函数调用 connect_member
期望收到一个指向-T
的指针,然后是一个指向-T
成员函数的指针(它采用未指定的参数和 returns 没什么)
mutable std::map<int, std::function<void(Args...)>> slots_;
slots_
是 Signal
的数据成员,类型 map
从整数到函数返回空值。 mutable
关键字告诉编译器可以更改 slots_
即使拥有的 Signal
是 const
(例如,在声明为 const
的成员函数中) ).