template <typename T, typename R, typename ...A>
struct decay<T, R(A..., ...)> { using type = 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..., ...); };
template <typename R, typename ...A>struct decay<R(A..., ...)> { using type = R(*)(A..., ...); };
是 decay
的一个特化版本,用于捕获特定类型的函数签名。我不明白为什么你会有一个两个参数版本的decay,然后忽略第一个参数。 - Yakk - Adam Nevraumontint printf(const char *,...)
。在这段代码中:R(A..., ...);
,第一个省略号展开了参数包A,而第二个省略号则作为函数类型的一部分保留。 - HolyBlackCatdecay
有两个参数,而不是一个。这就是为什么会让人困惑的原因。结果证明它是hana::details
中的一种优化。我猜测它保留了T
,以生成稍微更好的错误消息,并且他们发现这(以某种方式)并没有导致编译开销。我很惊讶第一个参数没有导致额外的编译成本,但我不是模板微观优化方面的专家。 - Yakk - Adam Nevraumonttemplate <typename T, typename R, typename ...A> struct decay<T, R(A...)> { using type = R(*)(A...); };
有什么不同。 - John Smith
std::decay
的合理代码,但没有理由使用T
... 我的第一个猜测是你复制错了。 - Yakk - Adam Nevraumontstd::decay
是什么吗?你理解函数参数类型衰减的概念吗?“这的确意味着什么”不是一个有用的问题。请更具体一些。 - Yakk - Adam Nevraumontstruct decay<T, R(A...)>
有何不同。 - John Smith