我有一个用于管理相机配置的 API。有 344 个单独的选项需要管理。当某个值发生变化时,API 会调用回调函数来通知程序。注册函数需要一个
void RegisterCallback(Option * ptr, void (fn*)(void*))
函数指针作为回调函数。我不能使用单个函数进行回调,因为我现在知道回调来自.
一种解决方案是创建 344 个单独的回调函数:
void callback0(void*);
void callback1(void*);
...
void callback{n-1}(void*);
static void(*)(void*) callbacks[] = {callback0, callback1, ..., callback{n-1}};
Run Code Online (Sandbox Code Playgroud)
对于此解决方案,我需要使用单独的工具/脚本生成标头。
另一种解决方案是使用一些预处理器魔法(BoostPP),比如
BOOST_PP_FOR((0,1024), PRED, OP, MYSTERIOUS_CALLBACK_MACRO);
Run Code Online (Sandbox Code Playgroud)
根据我的经验,这些宏对于开发人员来说是不可读的,并且难以维护。
理想情况下,我可以使用类似的东西
RegisterCallback(popt, [n](void*){/*n-th callback*/});
但是 lambda 函数是一个函子而不是函数指针。
我的问题是:我可以动态创建这些函数吗?或者有没有比上面两个更好的解决方案?
谢谢你。
编辑
我从 Botje 那里得到了答案。将对象传递给函数回调需要您访问二进制级别的代码(超出 C/C++ 级别)。如果您可以允许,那么 libffi 可以是一个解决方案,因为它会生成一个指向您的函数的每个实例的特定指针。它得到了广泛的支持,但是,例如 Visual Studio Compiler 不在列表中。
编辑 2 正如其他人指出的那样,它也应该与 VS 一起使用。
我想将公式放在我的网页中,该网页使用 (dotnet Kestrel)。我不想从网络加载 javascript 库,所以我使用 webpack 和 npm 作为我的包。我的问题是,我发现无法加载 MathJax。我尝试了以下方法:
import 'mathjax-full';
require('mathjax-full'); // << not the error itself
import MathJax from 'mathjax-full';
Run Code Online (Sandbox Code Playgroud)
我得到的最烦人的错误是:
ReferenceError: require is not defined
Run Code Online (Sandbox Code Playgroud)
我必须做一些明显错误的事情。错误消息来自 MathJax 内部。我也尝试导入requirejs,因为一些论坛提到这是某种“解决方法”。我在运行 WebPack 时遇到的错误是:
ERROR in ./node_modules/requirejs/bin/r.js 1:0
Module parse failed: Unexpected character '#' (1:0)
Run Code Online (Sandbox Code Playgroud)
有没有人在 WebPack 上使用 MathJax 成功?
我有一个常见问题,这一次,我不想解决它,而是想了解这种设计选择的好处。我拥有 15 年以上的 Linux/C++ 开发经验,但在构建 Windows 应用程序方面遇到了困难。
我有一个与专有组件(Intel OneApi 和 Basler Pylon)链接的应用程序。我想调试我的应用程序,但我无法在调试模式下编译我的代码,因为专有组件不为其库提供调试版本。
在 Linux 上我可以混合使用任何库;发布和调试。我什至可以混合使用不同编译器版本构建的库,只要 ABI 在不同版本之间不发生变化即可。
如果我无法使用 MSVC 在 Windows 上以调试模式构建应用程序,那么我应该如何调试它们?
如果官方推荐的是“只写好代码”的方法,那么这种限制有什么令人难以置信的好处呢?该库的运行速度是否快了 2 倍?占用的存储空间是否减少了 10 倍?
可笑的是,MinGW即使在 Windows 上也允许混合调试和发布库,但是专有库是使用 MSVC 构建的。
感谢您的见解。