2017-03-27 73 views
6
template <typename T, typename R, typename ...A> 
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); }; 

这是什么意思?我需要一些帮助〜struct decay <T,R(A ...,...)>是什么意思

+1

你从哪里看到该代码?它看起来类似于某人合理用于实现'std :: decay'的内容,但没有理由使用'T' ......我的第一个假设是你错误地复制了它。 – Yakk

+0

@Yakk:这段代码来自boost :: hana。 –

+1

Aha:http://www.boost.org/doc/libs/1_62_0/libs/hana/doc/html/structboost_1_1hana_1_1detail_1_1decay.html这是一个优化。这解释了否则无意义的设计;他们正在解决模板实例化的低效问题。 – Yakk

回答

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

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

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

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::decayRdoubleA...int, char。而...将“匹配C风格的varags”。

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

C样式可变参数与模板variardic参数不一样。他们早于它。

+0

非常感谢。这就是我想知道的。 –

6

这个专门化是将函数类型衰减到相应的指针函数类型的专门化之一,它反映了函数左值衰减到函数指针前值的方式。

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

+0

有什么不同?我不明白为什么会出现这样的两个参数“decay”。 – Yakk

+1

'template struct decay {using type = R(*)(A ...,...); };'是专门用于捕获特定类型函数签名的'decay'。我不明白为什么你会有一个两个参数的衰减版本,然后忽略第一个参数。 – Yakk

+0

@KerrekSB:我不太明白你说的话,你能解释一下吗? –