提问人:monk234 提问时间:7/2/2023 最后编辑:monk234 更新时间:7/2/2023 访问量:113
C++ - 这些 lambda 中的参数是如何传递的?
C++ - How are the arguments passed around in these lambdas?
问:
我正在查看一个开源存储库,其中包含用 C++ 编写的此文件。这两个函数使用 lambda 和回调,我只是想更好地了解操作的顺序以及它们如何协同工作。
这个区块在被调用时是如何执行的?WindowScenarioselectOpen(scenarioselect_callback callback)
下面是代码块:
WindowBase* WindowScenarioselectOpen(scenarioselect_callback callback)
{
return WindowScenarioselectOpen([callback](std::string_view scenario) { callback(std::string(scenario).c_str()); });
}
WindowBase* WindowScenarioselectOpen(std::function<void(std::string_view)> callback)
{
auto* window = static_cast<ScenarioSelectWindow*>(WindowBringToFrontByClass(WindowClass::ScenarioSelect));
if (window != nullptr)
{
return window;
}
int32_t screenWidth = ContextGetWidth();
int32_t screenHeight = ContextGetHeight();
ScreenCoordsXY screenPos = { (screenWidth - WW) / 2, std::max(TOP_TOOLBAR_HEIGHT + 1, (screenHeight - WH) / 2) };
window = WindowCreate<ScenarioSelectWindow>(WindowClass::ScenarioSelect, screenPos, WW, WH, 0, callback);
return window;
}
此外,在另一个文件中定义为 。scenarioselect_callback
using scenarioselect_callback = void (*)(const utf8* path);
根据我的理解,对第一个 windowscenarioselect 的调用定义了一个传递到第二个 windowscenarioselect 的 lambda。这个 lambda 接受一个 ,它用于构造一个字符串,然后用 转换为一个 C 字符串,然后将其传递到定义中。string_view scenario
c_str
scenarioselect_callback
我的困惑是我认为我们不能从 a 构造 a,另一个问题是,作为 a 的返回可以用作 吗?string
string_view
c_str
char*
utf8*
我对具有更长主体的第二个函数不太感兴趣,我更感兴趣的是参数是如何设置和工作的,以使第二个函数工作。
答:
我的困惑是我认为我们无法从string_view构造字符串,
没有从 a 到 a 的隐式转换,这是真的。但是,允许进行显式转换:std::string_view
std::string
std::string to_string(const std::string_view &sv)
{
return std::string{sv};
}
尝试用平原召唤隐式转换在这里是行不通的,但允许显式构造。并执行预期的操作:包含与定义的 .return sv;
std::string
std::string_view
c_str 的 Return 是 char* 可以用作 UTF8* 吗?
不。对于初学者,返回 a 而不是 .c_str()
const char *
char *
另一个使用 scenarioselect_callback = void ()(const utf8 path) 的文件);
细节决定成败。此处指定了 A,而不是 。对 C++ 标准的简短搜索似乎没有找到任何提及 C++ 库中定义的称为类型的内容。const utf8 *
utf8 *
utf8
奥卡姆剃刀得出的结论是,这只是你的应用程序代码,所以你真的有一个这里,它非常乐意返回。utf8
typedef
char
const char *
c_str()
评论