如何声明采用字符串的闭包类型,返回void?

时间:2018-07-23 07:32:07

标签: c++ closures c++14

我有一个闭包作为全局变量,必须只接受一个字符串(并记录下来):

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的闭包的引用。如何声明这种类型,或者我需要其他方法?

3 个答案:

答案 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的提示。