![](/img/trans.png)
[英]For constructors, how do I choose between variadic-templates vs std::initializer_list?
[英]::std::initializer_list vs variadic templates
通过::std::initializer_list
传递多个参数是否比variadic函数模板方法有任何优势?
在代码中:
template <typename T> void f(::std::initializer_list<T> const);
template <typename ...A> void f(A&& ...args);
请注意,类型A...
也可以通过SFINAE或static_assert()
限制为单一类型。 参数可以通过...迭代
您可以以不能通过参数包的方式迭代std::initializer_list
(除非您有C ++ 17并且首先将其折叠)。 例如,您可以使用列表for
循环。 使用参数包,您只能通过递归专用定义来扩展它们。
使用initializer_list<T>
而不是可变参数模板是有好处的,假设任何一个都可以解决问题。
例如,函数定义只能包含很多参数,甚至是可变参数。 允许实现具有硬限制,并且标准仅要求限制至少为256.对于函数调用中的参数也是如此。
相比之下,braced-init-list中的值的数量最小限制为16K(实现通常允许更多)。 因此,如果用户使用一组巨大的值调用此函数是合理的,那么initializer_list
是唯一可以让编译器工作的initializer_list
。
有时我和你的一样使用了可变参数模板函数,但后来意识到我需要更多参数,可能是模板化的。 在那种情况下, typename... A
太急切了,我很乐意依靠调用站点上的大括号来清楚地指定可变参数列表的结束位置,以及以下可选参数的开始位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.