在下面的代码中 <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)
是单一类型。读作“函数采用 Arg0
和 Arg1
返回 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/