C++ 当涉及参数包时,我是否可以依赖具有默认值的参数类型被推断为空包?
举个例子:C++ 当涉及参数包时,我是否可以依赖具有默认值的参数类型被推断为空包?,c++,templates,variadic-templates,c++17,default-parameters,C++,Templates,Variadic Templates,C++17,Default Parameters,举个例子: #include <iostream> #include <tuple> #include <utility> template <class... Ts, size_t... Is> void foo(std::tuple<Ts...> t, std::index_sequence<Is...> = {}) { if (sizeof...(Ts) != sizeof...(Is)) {
#include <iostream>
#include <tuple>
#include <utility>
template <class... Ts, size_t... Is>
void foo(std::tuple<Ts...> t,
std::index_sequence<Is...> = {}) {
if (sizeof...(Ts) != sizeof...(Is)) {
foo(t, std::make_index_sequence<sizeof...(Ts)>{});
return;
}
(std::cout << ... << std::get<Is>(t));
}
int main() {
foo(std::make_tuple(1, 2, 3));
}
#包括
#包括
#包括
模板
void foo(std::tuple t,
std::index_序列={}){
如果(sizeof…(Ts)!=sizeof…(Is)){
foo(t,std::make_index_sequence{});
返回;
}
(std::cout是的。您所依赖的,来自[temp.arg.explicit]:
未以其他方式推导的后续模板参数包(14.5.3)将被推导为模板参数的空序列
实际上,“拖尾模板参数包”的组成部分从来没有完全正确地定义过,但所有编译器在这里都解释为…
也就是说,我不会依赖它,不是因为它不正确,而是因为它使代码难以理解。特别是在这种情况下,有一种简单的方法可以提取lambda的所有元素:
std::apply()
:
模板
void foo(std::tuple t){
标准::应用([](自动和…参数){
(std::cout除了这个令人恼火的问题:是的(并且没有未定义的行为)@dieterlucking实际上我不知道如何表达它…谢谢你though@DieterLücking:“恼人”有点刺耳。标题可能不雅观,但不是冒犯或挑衅。我把标题读作“我知道这是有效的,但这在当前的编译器中是否正确实现了?”,但我将正文理解为“这是有效的吗?”@W.F。我不会这样解释原始标题,只是解释当前标题。在正文中,从上下文看已经够清楚了。不管怎样,您现在已经在注释中清除了它,这也行得通。:)
template <class... Ts>
void foo(std::tuple<Ts...> t) {
std::apply([](auto&... args) {
(std::cout << ... << args);
}, t);
}