在部分模板特化中使用括号

PMo*_*bed 3 c++

在下面的代码中,<Result (Arg0, Arg1)>和有什么区别<Result, Arg0, Arg1>

#include <cstddef>
#include <iostream> 

using namespace std;

template <typename Result, typename Arg0 = void, typename Arg1 = void>
class Signal;

template <typename Result, typename Arg0, typename Arg1>
class Signal<Result (Arg0, Arg1)> // is this the same as <Result, Arg0, Arg1>
{
  Result test(Arg0 arg0, Arg1 arg1)
  {

  }
};

int main()
{
  Signal<void (int, int)> s; // or Signal<void, int, int>?  
} 
Run Code Online (Sandbox Code Playgroud)

HTN*_*TNW 5

Result(Arg0, Arg1)是单一类型。这是读“功能回吐Arg0Arg1返回Result”。当你专攻时Signal

template <typename Result, typename Arg0, typename Arg1>
class Signal<Result(Arg0, Arg1)>
Run Code Online (Sandbox Code Playgroud)

您只给出了 1 个参数,但需要 3 个。其他 2 个成为默认值,如模板声明中所述。因此,这与

template <typename Result, typename Arg0, typename Arg1>
class Signal<Result(Arg0, Arg1), void, void>
Run Code Online (Sandbox Code Playgroud)

请注意,特化中的参数名称与声明匹配完全没有区别。将Arg0在专业化是从不同Arg0的声明。在专业化中,Arg0未指定 -from-the-declaration,这就是它默认为 的原因void。同样,在声明中

Signal<void(int, int)> s;
Run Code Online (Sandbox Code Playgroud)

你真的写了

Signal<void(int, int), void, void> s;
Run Code Online (Sandbox Code Playgroud)

我怀疑你打算做这些事情中的任何一件。只需使用逗号。