gpt4 book ai didi

c++ - 在函数调用中定义函数

转载 作者:行者123 更新时间:2023-11-30 04:29:53 25 4
gpt4 key购买 nike

为了节省时间,我想到了一个想法,即创建一个临时函数以用作需要它的函数的参数。我追求这种行为的原因是为了以一种简单的方式(使用 Win32 API)在新线程中执行操作,而不必定义我将使用的所有类型的函数。

这是一个例子:

void msg (const string & message) {
MessageBox (0, message.c_str(), "Message", 0);
}

这将产生一个消息框,但您的程序会暂停直到关闭。解决方案是为消息框创建一个与主线程同时运行的线程。

void msg (const string & message) {
CreateThread (0, 0,
(LPTHREAD_START_ROUTINE)({MessageBox (0, message.c_str(), "Message", 0);}),
0, 0, 0);
}

在这种情况下,LPTHREAD_START_ROUTINE 定义为
typedef DWORD (*LPTHREAD_START_ROUTINE)(LPVOID 参数);

因为我有多个函数需要另一个线程来实现这样的目的,所以将函数放在对 CreateThread 的调用中似乎运行良好。

但是假设我想使用那个 LPVOID 参数。我想知道这种方法有多标准,以及在哪里可以找到如何将它用于更高级的技术。另外,我知道在一个函数中使用它来存储它供以后使用(例如,一个消息循环函数,你可以在其中添加要处理的消息和一个相应的函数来调用)是一个坏主意,因为该函数是临时的,不会可以在需要时调用。除了线程之类的东西之外真的还有其他用途吗?为了使用它而在其他地方创建一行函数很烦人?

最佳答案

它被称为“lambda”。它们对于除此之外的许多用途都非常有用,并且在 C++11 标准中。您可以在最新的 GCC 和 MSVC 中找到它们。但是,MSVC 当前的实现不允许转换为函数指针,因为标准当时并未指定此类转换。 VC11 将实现这种转换。此代码符合标准 C++11:

void msg (const string & message) {
CreateThread (0, 0,
[](LPVOID* param) { MessageBox (0, message.c_str(), "Message", 0); },
0, 0, 0);
}

关于c++ - 在函数调用中定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9042407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com