C++ - 这些 lambda 中的参数是如何传递的?

C++ - How are the arguments passed around in these lambdas?

提问人:monk234 提问时间:7/2/2023 最后编辑:monk234 更新时间:7/2/2023 访问量:113

问:

我正在查看一个开源存储库,其中包含用 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_callbackusing scenarioselect_callback = void (*)(const utf8* path);

根据我的理解,对第一个 windowscenarioselect 的调用定义了一个传递到第二个 windowscenarioselect 的 lambda。这个 lambda 接受一个 ,它用于构造一个字符串,然后用 转换为一个 C 字符串,然后将其传递到定义中。string_view scenarioc_strscenarioselect_callback

我的困惑是我认为我们不能从 a 构造 a,另一个问题是,作为 a 的返回可以用作 吗?stringstring_viewc_strchar*utf8*

我对具有更长主体的第二个函数不太感兴趣,我更感兴趣的是参数是如何设置和工作的,以使第二个函数工作。

C++ lambda utf-8 字符串视图

评论

0赞 john 7/2/2023
相关 stackoverflow.com/questions/59424390/...
2赞 Eljay 7/2/2023
什么是调试器,它如何帮助我诊断问题?
0赞 alfC 7/2/2023
请改进问题的标题

答:

0赞 Sam Varshavchik 7/2/2023 #1

我的困惑是我认为我们无法从string_view构造字符串,

没有从 a 到 a 的隐式转换,这是真的。但是,允许进行显式转换std::string_viewstd::string

std::string to_string(const std::string_view &sv)
{
    return std::string{sv};
}

尝试用平原召唤隐式转换在这里是行不通的,但允许显式构造。并执行预期的操作:包含与定义的 .return sv;std::stringstd::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

奥卡姆剃刀得出的结论是,这只是你的应用程序代码,所以你真的有一个这里,它非常乐意返回。utf8typedefcharconst char *c_str()