`struct decay<T, R(A..., ...)>` 是什么意思

What's the meaning of `struct decay<T, R(A..., ...)>`

template <typename T, typename R, typename ...A>
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); };

它的确切含义是什么?我需要一些帮助~

此特化是将函数类型衰减到相应的函数指针类型的特化之一,它反映了函数左值衰减到函数指针纯右值的方式。

这个特殊的特化用于可变参数函数(那些参数列表以省略号结尾的函数,以便它接受与任何参数都不匹配的参数)。

int foo(int);
int bar(int, ...);

这是两个不同的函数。 foo 属于 int(int) 类型。 bar 属于 int(int,...).

类型

... 是 C 风格的可变参数,不要与也使用 ....

的可变模板参数混淆
template <typename T, typename R, typename ...A>
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); };

这部分是 std::decayboost::hana 中的优化版本的实现。 typename TT 部分是转移注意力的部分,是该优化的一部分。

它是匹配 R(A..., ...) 的特化,其中 A...R 是从函数签名推导出来的。

如果您将 double(int, char, ...) 作为此 hana::details::decay 的第二个参数传递,R 将是 doubleA... 将是 int, char . ... 会 "match the C-style varags".

此特定专业化的目的是将以 C 样式可变参数结尾的函数签名映射到指向相同签名的指针。所以它将 double(int, char, ...) 映射到 double(*)(int, char, ...).

C 风格可变参数与模板可变参数不同。他们早于它。