在下面的代码中 <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>?
}

最佳答案

Result(Arg0, Arg1) 是单一类型。读作“函数采用 Arg0Arg1 返回 Result”。当您专攻 Signal 时,

template <typename Result, typename Arg0, typename Arg1>
class Signal<Result(Arg0, Arg1)>

您只给出了 1 个参数,但需要 3 个。其他 2 个成为默认值,如模板声明中所述。因此,这与
template <typename Result, typename Arg0, typename Arg1>
class Signal<Result(Arg0, Arg1), void, void>

请注意,特化中的参数名称与声明匹配完全没有区别。特化中的 Arg0 与声明中的 Arg0 不同。在特化中,没有指定 Arg0 -from-the-declaration,这就是它默认为 void 的原因。同样,在声明中
Signal<void(int, int)> s;

你真的写了
Signal<void(int, int), void, void> s;

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

关于c++ - 在部分模板特化中使用括号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58035321/

10-11 22:46