【发布时间】:2018-07-23 07:32:07
【问题描述】:
我有一个作为全局变量的闭包,它必须只接受一个字符串(并记录它):
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。如何声明这样的类型,或者我需要一种不同的方法?
【问题讨论】:
-
不知道 lambda 的实际类型。你需要用 auto 或 template 推断它,但如果你有一个空的闭包,你的 lambda 将可以转换为函数指针
-
看看
std::function看看它是否满足您的需求。 -
@SanderDeDycker OP 没有显示任何需要
std::functionexept 如果字段表示容器 -
@Tyker 我认为您的意思是说“空捕获子句”。这里似乎就是这种情况,因此您可以将其存储在
void (*variable_name)(const std::string &)类型的函数指针中 -
嗯...如果它是无捕获的,为什么不使用常规功能呢?