私はいくつかの信号/スロットの実装を見てきましたが、例外なくかなり複雑で、QtのようにMOCと追加のコード生成に依存しているものもあります。
脅威の安全性などの懸念があることは承知していますが、単純なシングルスレッドのシナリオの場合、次のような単純なアプローチを採用することに何か問題があります。
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関数にデータを渡すことは引き続き可能です。それでは、ボタンがクリックされたときにコードを実行するのと同じくらい些細なことのすべての複雑さはなぜですか。