可以通过递归来直接办理
第二个例子:
除了递归本身之外,你还能用make_index_sequence的办法来利用
如果这里的foo返回值是void,你可以通过逗号表达式+个1给他
C++17:
从C17开始,你可以合营fold expression + std::apply的办法将tuple的foreach实现:
这里的折叠表达式会展开为,表达式
你还能用if constexpr来完成tuple的for-each
这也是为什么我们在写递归tuple做iterator的时候,由于我们要对template <int dex, typename ...Ts>中的index做base为0的递归跳出,因此这是一个偏特化,因此我们只能采纳模板类 - template class的缘故原由:
可以看到这里先通过:
一个wrap去做对应print_tuple的入口tuple_size<tuple<Ts...>>::value来获取index作为模板non-type传入print_tuple里面的print_tuple<size - 1, Ts...>{}(t)的{}便是布局这个类本身的工具然后调用operator()来调用细心的读者可能会创造,上面的实现是倒叙的,那么能不能把base写成tuple_size - 1呢,比如下面的实现
但是你会创造编译不了,缘故原由便是虽然tuple_size<tuple<Ts...>>::value - 1是编译期就能知道的结果,但是编译器不认可,他只能吸收大略表达式"simple identifiers",因此这里我们无法顺利编译通过.后来经由测试创造,你可以用C++14的generic lambda来办理这个问题。
你乃至可以用parameter pack的generic lambda来完成(由于就在于,模板的展开是在你for_each之前就要确定函数类型,此时的函数Print压根不知道类型,但是泛型lambda会得到你折叠表达式之后才会去实例化确定类型,因此可以work.因此前者的模板办法,你必须写去世在里面,即不能传入,要直接把print写去世)
当然上面的解包你也可以用折叠表达式
同时要想办理上面打印逆序的问题,你只须要把你的cout放在递归的下面,即
从C17开始,你可以合营fold expression + std::apply的办法将tuple的foreach实现:
这里的折叠表达式会展开为,表达式
你还能用if constexpr来完成tuple的for-each
不然的话,你就只能通过类似compile递归的办法来实现tuple的for_each,比如