我正在编写一个类来包装与设备一起使用的基于 C 的库的一部分,其中每个设备都配置有用于处理数据的回调函数指针。MyClass将为每个设备创建一个实例。见下文:
struct DeviceConfig {
void (*callback)(char *data);
};
class MyClass {
private:
DeviceConfig config;
public:
void myCallback(char *data);
MyClass() {
// Would like to set config.callback so that a call to it will result in a call of this->myCallback(data).
}
};
Run Code Online (Sandbox Code Playgroud)
由于捕获 lambda 无法转换为函数指针,因此我尝试了以下解决方法:
template<MyClass *MC>
auto binder() {
return [](char *data) { MC->myCallback(data); };
}
MyClass::MyClass() {
config.callback = binder<this>();
}
Run Code Online (Sandbox Code Playgroud)
然而,编译器(最新的 GCC)不喜欢binder在构造函数中使用,因为this在编译时不一定知道,尽管我知道 的实例MyClass只会在编译时声明。
C++20 引入了“必须生成编译时常量”consteval的函数(和构造函数) …
我正在为显示屏幕的嵌入式设备上编写显示代码,每个屏幕都有一些按钮.屏幕之间的按钮数量不同,但数量在编译时是已知的.
现在,这是一个如何设置类的简化版本:
class Button;
class Screen {
private:
Button *buttons;
unsigned int buttonCount;
public:
Screen(Button *_buttons, unsigned int _buttonCount)
: button(_buttons), buttonCount(_buttonCount) {}
};
Run Code Online (Sandbox Code Playgroud)
以下是我如何使用它们的想法:
// For this example, Button has a constructor taking a string for
// the button's label
static Button buttonsForMainMenu[] = {
Button("Do this"),
Button("Do that"),
Button("Exit")
};
Screen mainMenu (buttonsForMainMenu, 3);
Screen *currentScreen = &mainMenu;
int main() {
// ...
while (1) {
currentScreen->show();
// handle buttons, etc.
}
}
Run Code Online (Sandbox Code Playgroud)
我想避免为按钮设置单独的数组.理想情况下,这样的事情:
Screen mainMenu ({
Button("Do …Run Code Online (Sandbox Code Playgroud)