`struct decay <T,R(A ...,...)>`的含义是什么?

Joh*_*ith 6 c++ templates metaprogramming

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

这究竟是什么意思?我需要一些帮助〜

Yak*_*ont 7

int foo(int);
int bar(int, ...);
Run Code Online (Sandbox Code Playgroud)

这是两个不同的功能. foo是类型的int(int). bar是类型的int(int,...).

...是C风格的变种,不要与也使用的变异模板参数混淆....

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

这部分std::decay内部优化版的实现boost::hana.在typename TT部分是红鲱鱼,最优化的一部分.

它是一种特殊化,可以匹配R(A..., ...),在哪里A...,R从函数签名中推导出来.

如果你double(int, char, ...)作为第二个参数传递给它hana::details::decay,那R将是doubleA...将来int, char.并且" ...将匹配C风格的varags".

这种特殊的专业化的目的是将以C风格的变量结尾的函数签名映射到指向相同签名的指针.所以它映射double(int, char, ...)double(*)(int, char, ...).

C style varargs与模板variardic参数不同.他们早于它.


Ker*_* SB 6

这种特化是将函数类型衰减到相应的指向函数类型的特化之一,它反映了函数左值衰减到函数指针prvalues的方式.

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