Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当涉及参数包时,我是否可以依赖具有默认值的参数类型被推断为空包?_C++_Templates_Variadic Templates_C++17_Default Parameters - Fatal编程技术网

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);
}