我一直在研究一些信号/插槽的实现,它们毫无例外都非常复杂,有些甚至依赖于 MOC 和额外的代码生成,比如 Qt 的那些。
我意识到存在诸如威胁安全之类的问题,但是对于一个简单的单线程场景,采用简单的方法是否有问题,例如:
typedef void (*fPtr)();
class GenericButton
{
public:
GenericButton() : funcitonToCall(nullptr) {}
void setTarget(fPtr target) {
funcitonToCall = target;
}
void pressButton() {
if (funcitonToCall) funcitonToCall();
}
private:
fPtr funcitonToCall;
};
void doSomething(){
std::cout << "doing something..." << std::endl;
}
void doSomethingElse(){
std::cout << "doing something else..." << std::endl;
}
int main(){
GenericButton myButton;
myButton.setTarget(doSomething);
myButton.pressButton();
myButton.setTarget(doSomethingElse);
myButton.pressButton();
}
仍然可以链接其他几个方法并在目标 void 函数中传递数据。那么,为什么在单击按钮时执行一些代码这样微不足道的事情会变得如此复杂。