Gri*_*ort 1 c++ signals-slots qt-signals
在JavaScript中,您可以执行以下操作:
function bunny() { alert("The bunny jumped."); }
var oldBunny = bunny;
function bunny() {
oldBunny();
alert("The bunny also ran.");
}
bunny(); // The bunny Jumped. The bunny also ran.
Run Code Online (Sandbox Code Playgroud)
可以看出,旧的"bunny"函数通过复制到变量来附加代码,然后重新创建具有相同名称的函数.原始函数的副本运行,新代码也会运行.
我想在C++中复制一个类似的机制.
现在,在您崩溃并开始解释静态和动态语言之间的差异之前,我明白了.我不是在寻找与所提供的相同的东西,但我确实希望有类似的东西.
此外,我不是试图修改现有代码; 我希望格式化自己的源代码,以允许其他用户使用这样的机制.
我的第一个想法之一就是在代码中设置各种宏,以后可以被其他文件修改.
另一个想法是创建一个像QT一样的信号和插槽系统.虽然我不知道如何自己做这样的事情.
谢谢你的阅读; 我希望你有一些建议.
好吧,如果你认识到JavaScript函数的哪个特性使这成为可能,那么在C++中做同样的事情并不难.在JavaScript函数中也有闭包,C++中的常规函数没有.但是C++ lambda属于闭包类型.如果一个人定义bunny为既可以保存闭包类型的对象又可以重新分配的东西,那么你就可以了.
C++标准库为此提供了一个很好的默认选择,形式为std::function.我们可以重新编写您的原始JavaScript,如下所示:
std::function<void()> bunny = [] {
std::cout << "The bunny jumped.\n";
};
auto oldBunny = std::move(bunny);
bunny = [oldBunny] {
oldBunny();
std::cout << "The bunny also ran.\n";
};
bunny();
Run Code Online (Sandbox Code Playgroud)