我无法理解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 */
如何调用它以便我可以自己寻找。 我找到了过于复杂的例子吗?
感谢。
答案 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_
为Signal
,const
也可以更改(例如,在成员函数内声明{ {1}})。