c++ - 这个语法是什么意思, `class template <class R, class ...Args> class name<R(Args...)>`

标签 c++ multithreading promise variadic-templates packaged-task

我一直在尝试更多关于 C++ 中的多线程编程,但我很难理解 std::promise所以我开始在这个网站上寻找答案,结果发现,有人和我有同样的问题。但是看完答案让我更加困惑 这是答案中的代码,大概是 std::packaged_task 的类似实现

template <typename> class my_task;

template <typename R, typename ...Args>
class my_task<R(Args...)>
{
    std::function<R(Args...)> fn;
    std::promise<R> pr;             // the promise of the result
public:
    template <typename ...Ts>
    explicit my_task(Ts &&... ts) : fn(std::forward<Ts>(ts)...) { }

    template <typename ...Ts>
    void operator()(Ts &&... ts)
    {
        pr.set_value(fn(std::forward<Ts>(ts)...));  // fulfill the promise
    }

    std::future<R> get_future() { return pr.get_future(); }

    // disable copy, default move
};

在这段代码中,

1- 这个语法是什么意思 template <typename R, typename ...Args> class my_task<R(Args...)> ,更具体地说,<R(Args...)> 的目的是什么? ?

2- 为什么要对类进行前向减速?

谢谢

最佳答案

评论中对 1 和 2 应该如何成为两个独立的问题进行了一些简短的讨论,但我认为它们只是同一个问题的两个方面,原因如下:

template <typename> class my_task;

template <typename R, typename ...Args>
class my_task<R(Args...)>; ....

第一个语句声明一个模板,该模板将 typename 作为其唯一的模板参数。第二条语句声明该模板类的特化。

在这种情况下:

 R(Args...)

将专用于匹配函数的任何 typename。此模板特化将匹配任何为 typename 传递函数签名的模板实例化。除非模板本身存在任何问题,否则此模板特化将用于:

 my_task<int (const char *)>

或者,一个接受const char * 参数并返回int 的函数。模板特化也将匹配:

 my_task<Tptr *(Tptr **, int)>

或者,一个带有两个参数的函数,Tptr ** 和一个 int,并返回一个 Tptr *(这里,Tptr 是其他类)。

模板特化将不匹配:

 my_task<int>

或者

 my_task<char *>

因为它们不是函数签名。如果您尝试使用非函数 typename 实例化此模板,您将遇到编译错误。为什么?

嗯,那是因为模板没有定义:

template<typename> class my_task;

不要认为这只是一个前向声明。它是采用模板参数的模板的前向声明,模板不会在任何地方定义。相反,模板声明允许后续模板特化声明,该声明将仅匹配作为模板参数传递的特定类型。

这是一种常见的编程技术,用于限制可与特定模板一起使用的 typenameclass 的种类。模板不能用于任何 typenameclass,而是只能用于某些子集。在这种情况下,函数 typename 或签名。

它还使模板本身更容易显式引用(在本例中)模板参数的返回类型和参数类型。如果模板只有一个乏味的、单一的 typename 作为模板参数,它就无法轻松访问函数的返回类型或函数参数的类型。

关于c++ - 这个语法是什么意思, `class template <class R, class ...Args> class name<R(Args...)>`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34033586/

相关文章:

c++ - 多个线程中的 malloc()/free() 在 Windows 上崩溃

c++ - 如何读取与另一个线程共享的 std::queue?

c++ - 一个线程写入变量,另一个线程读取该变量,我如何(C++11 之前)保护该变量?

javascript - 在嵌套的 promise 链中重新抛出异常

Javascript: promise 等待条件或在尝试次数后中止

c++ - 'windows.h',其他平台呢?

c++ - 声明一个 double 给它一个值 0 但打印结果意外改变

swift - Swift 和 Spring 中的链接动画无法正常工作

c++ - "number>>1"中的 "binary(number >> 1)"是什么意思(十进制转二进制)

c++ - 什么 Ruzzle 板包含最独特的单词?