小编cly*_*yne的帖子

为什么在 consteval 构造函数中编译时不知道“this”?

我正在编写一个类来包装与设备一起使用的基于 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的函数(和构造函数) …

c++ c++20

3
推荐指数
1
解决办法
1547
查看次数

C++在编译时使用构造函数已知的长度初始化数组成员

我正在为显示屏幕的嵌入式设备上编写显示代码,每个屏幕都有一些按钮.屏幕之间的按钮数量不同,但数量在编译时是已知的.

现在,这是一个如何设置类的简化版本:

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)

c++ c++17

1
推荐指数
1
解决办法
122
查看次数

标签 统计

c++ ×2

c++17 ×1

c++20 ×1