【发布时间】:2020-06-04 00:48:15
【问题描述】:
我正在编写一个类来包装与设备一起使用的基于 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).
}
};
由于无法将捕获的 lambda 转换为函数指针,因此我尝试了以下解决方法:
template<MyClass *MC>
auto binder() {
return [](char *data) { MC->myCallback(data); };
}
MyClass::MyClass() {
config.callback = binder<this>();
}
但是,编译器(GCC 最新)不喜欢在构造函数中使用 binder,因为 this 在编译时不一定知道,尽管我知道 MyClass 的实例只会在编译时声明。
C++20 引入了consteval 函数(和构造函数),其中"must produce a compile-time constant."。但是,将consteval 添加到构造函数和/或binder 不会影响编译器的输出。 constexpr 也没有改变。
如果一个对象可以在编译时初始化,为什么对象的this也不能在编译时知道呢?以上可以通过其他方式实现吗?
【问题讨论】:
-
this实际上是成员函数的参数。 -
@NicolBolas 这似乎是正确的副本,但我认为您应该在此处添加一个答案,解释为什么即使
consteval函数也不允许这样做。 -
@NicolBolas 这是我的参考资料,但您可能有不同的参考资料:groups.google.com/a/isocpp.org/d/msg/std-proposals/FvE9w5_onQo/…
-
在持续评估期间实例化模板变得很混乱。
-
@NicolBolas 我不明白这个问题是如何回答我的,它根本不处理类或对象。它当然不能回答为什么
this在 consteval 构造函数中不可用。