我有一个闭包作为全局变量,必须只接受一个字符串(并记录下来):
auto log_info = [] (const std::string & str) { /* statements */ };
现在,我想改为创建对象的字段,现在编译器要求我指定实际类型。它是哪种类型?这是我尝试的声明,但没有获得很大的成功:
[] log_info = [] (const std::string & str)
[] (const std::string & str) log_info = [] (const std::string & str)
(const std::string & str) log_info = [] (const std::string & str)
我还尝试从编译器错误消息中猜测类型,但在秘密方面似乎很坚定:
int log_info = [] (const std::string & str)
:无效的用户定义的从“”到“ int”的转换
它是对使用const std ::&字符串并返回void的闭包的引用。如何声明这种类型,或者我需要其他方法?
答案 0 :(得分:4)
由于显示的lambda没有状态,因此可以将其隐式转换为函数指针,如下所示:
struct A {
/* Your member variable declaration: */
void (*closure) (const std::string&);
/* Initialize it with a lamdba. */
A() : closure([](const std::string&){}) {}
};
当您将状态放入捕获中时,以上代码片段将失败。然后,您可能要切换到类模板:
template <class Fct> struct B {
B(Fct&& f) : closure(std::forward<Fct>(f)) {}
Fct closure;
};
这里,必须在实例化时传递lamdba,并且对于由编译器推导的类型,需要C ++ 17:
B b{[](const std::string&){}};
答案 1 :(得分:1)
您正在寻找std::function<void(const std:string)>
吗?
答案 2 :(得分:0)
std::function<void(const std::string&)> log_info = [](const std::string& str) {
/* Statements */
};
感谢您提供有关std :: function的提示。