1. std::holds_alternative<std::string>(data) 是一个类型检查的表达式,用于检查给定的变量 data 是否包含 std::string 类型的值。

    std::holds_alternative 是 C++ 标准库中的一个函数模板,它的作用是判断给定的变量是否包含指定的类型。

  2. std::promise<void> 是 C++ 标准库中的一个模板类,用于提供一种机制,允许一个线程在某个时间点产生一个值(或异常),并使其他线程能够等待并获取该值(或异常)。

    在你提供的代码中, wsPromise 是一个名为 wsPromise 的对象,它是 std::promise<void> 类型的实例。这意味着它是一个用于产生 void 类型值的 promise 对象。

    std::promise 类提供了两个主要操作: set_value()set_exception() 。通过调用 set_value() ,可以在 promise 对象上设置一个值(在这种情况下,是 void 类型的值),然后通过调用 get_future() 获得一个与该 promise 相关联的 std::future 对象,其他线程可以通过该 future 对象等待并获取该值。

    以下是一个简单的示例,展示了如何使用 std::promise<void> 和相关的类来实现线程间的同步:

    #include <iostream>
        #include <thread>
    #include <future>
    void worker(std::promise<void>& promise) {
        // 模拟一些耗时的工作
        std::this_thread::sleep_for(std::chrono::seconds(2));
        
        // 工作完成后,设置 promise 的值
        promise.set_value();
    }
    int main() {
        std::promise<void> wsPromise;
        std::future<void> wsFuture = wsPromise.get_future();
        
        // 创建一个工作线程,并传递 promise 作为参数
        std::thread workerThread(worker, std::ref(wsPromise));
        
        // 等待工作线程完成
        wsFuture.wait();
        
        std::cout << "Worker thread finished." << std::endl;
        
        workerThread.join();
        
        return 0;
    }

    在上述示例中, worker() 函数是一个工作线程执行的函数。它接受一个 std::promise<void> 对象作为参数,并通过调用 set_value() 来设置该 promise 对象的值。主线程使用 get_future() 获取与 promise 对象相关联的 std::future 对象,并使用 wait() 函数等待工作线程完成。一旦工作线程完成并设置了 promise 的值,主线程将继续执行。

    需要注意的是, std::promisestd::future 提供了一种线程间通信的机制,其中一个线程通过 promise 设置值,而另一个线程通过 future 等待并获取该值。

  3. std::promise 类中的 set_exception() 函数用于在 promise 对象上设置一个异常,以通知与之关联的 std::future 对象所在的线程。

    当某个线程调用 set_exception() 函数并提供一个异常作为参数时,与该 promise 对象关联的 std::future 对象上的等待操作将会收到该异常(通过 std::future 对象的 get() 函数或 wait() 函数调用时抛出)。

    以下是一个示例,展示了如何使用 std::promiseset_exception() 函数来传递异常:

    #include <iostream>
        #include <thread>
    #include <future>
        #include <stdexcept>
    void worker(std::promise<int>& promise) {
        try {
            // 模拟一些工作
            std::this_thread::sleep_for(std::chrono::seconds(2));
            
            // 抛出一个异常
            throw std::runtime_error("Something went wrong.");
            
            // 设置 promise 的值(这行代码不会执行)
            promise.set_value(42);
        } catch (...) {
            // 捕获异常,并通过 promise 设置异常
            promise.set_exception(std::current_exception());
        }
    }
    int main() {
        std::promise<int> wsPromise;
        std::future<int> wsFuture = wsPromise.get_future();
        
        // 创建一个工作线程,并传递 promise 作为参数
        std::thread workerThread(worker, std::ref(wsPromise));
        
        try {
            // 等待工作线程完成
            int result = wsFuture.get();
            std::cout << "Worker thread finished with result: " << result << std::endl;
        } catch (const std::exception& ex) {
            std::cout << "Worker thread threw an exception: " << ex.what() << std::endl;
        }
        
        workerThread.join();
        
        return 0;
    }

    在上述示例中, worker() 函数模拟一个工作线程执行的工作。在这个例子中,工作线程抛出了一个 std::runtime_error 异常,然后通过 set_exception() 函数将异常传递给与 promise 对象关联的 std::future 对象。主线程使用 get() 函数获取 std::future 对象上的值时,如果工作线程抛出了异常, get() 函数将重新抛出该异常,然后可以在主线程中捕获并处理该异常。

    总而言之, set_exception() 函数允许在 promise 对象上设置异常,以便将异常传递给与之关联的 std::future 对象所在的线程,从而实现线程间的异常传递和处理。

  4. std::cin.ignore() 是 C++ 标准库中 std::cin 流的成员函数之一。它的作用是忽略输入流中的字符。

    std::cin.ignore() 函数通常与 std::cin 结合使用,用于清除输入缓冲区中的字符,以便接下来的输入操作不会受到之前输入的影响。

    该函数可以在两种形式下使用:

    1. std::cin.ignore() :调用函数时不传递参数。它会忽略输入流中的下一个字符,无论是换行符、空格符还是其他字符。
    2. std::cin.ignore(n, delim) :调用函数时传递两个参数。其中, n 是要忽略的字符数, delim 是可选的定界符(默认为换行符)。
      • 如果提供了 n ,则会忽略输入流中的前 n 个字符。
      • 如果同时提供了 ndelim ,则会忽略输入流中的字符,直到遇到定界符 delim 为止。

    这些函数在某些情况下很有用,例如当需要清除输入缓冲区中的残留字符时,或者在读取不同类型的数据之前需要忽略一些字符。

  5. 部分 C 语言库,在 c++ 文件中使用需要用 extern "C"{} 的形式包裹起来,否则编译链接时会找不到库中函数的实现,例如 FFmpeg 库中的库:

```C++
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavcodec/packet.h>
#include <libavformat/avformat.h>
}
```
更新于 阅读次数