【发布时间】:2023-01-11 04:23:10
【问题描述】:
我有一个关于将 lambda 模板对象存储为类成员的问题。 Invoker 类是一个存储任意 lambda 函数的模板化类。我想在另一个类 Worker 中存储 Invoker 的实例。但是,当Invoker用作类成员时,我不知道如何填写模板参数TCallback。它不像 main 函数中的第一行那样推导。如 cmets 所示,我试图在 Worker 中的某处定义一个 lambda,并将其传递给 Invoker 类型的成员。
我尝试过的是使用类方法的decltype,但它不能像通用 lambda 一样被调用——它需要类对象上下文才能运行。
非常感谢任何想法和一些解决方法。
谢谢你。
#include <iostream>
template <typename TCallback>
struct Invoker {
explicit Invoker(TCallback&& cb) : cb(cb) {}
TCallback cb;
void invoke() {
cb();
}
};
struct Worker {
void some_callback() {
std::cout << "callback in worker\n";
}
// Not working: some_callback is a member function and can only be called with the context object
Invoker<decltype(&Worker::some_callback)> invoker{&Worker::some_callback};
// How to make a something like this?
// auto lambda_in_class = [&]{some_callback()};
// Invoker<decltype(lambda_in_class)> invoker{lambda_in_class};
};
int main() {
Invoker invoker([]{std::cout << "invoker\n";});
Worker worker;
worker.invoker.invoke();
return 0;
}
【问题讨论】:
标签: c++ templates lambda metaprogramming template-meta-programming