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

标签 c++ winapi function

为了节省时间,我想到了一个想法,即创建一个临时函数以用作需要它的函数的参数。我追求这种行为的原因是为了以一种简单的方式(使用 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/

相关文章:

c++ - 使用 Qt C++ 读取 CSS 文件

winapi - 在 Windows Server 2019 上从作为 IIS APPPOOL 帐户运行的进程调用 OpenProcess 的访问被拒绝

winapi - ListBox.FindString 最坏情况下的运行时间是什么? O(n)、O(n log n)、O(1)?

PHP call_user_func 与仅调用函数

c++ - 在已经是模板可变参数的函数中传递可变参数

c++ - 以 map 作为参数的函数不起作用

c++ - 我可以在 C++ 中返回对该类中静态类(单例)实例的引用吗?

c++ - 帮助异步 I/O

r - 如何从R中的表函数中提取值

javascript - 使用带有返回值和 If/Else 语句的函数