std::index_sequence_for<T... >() 是如何工作的?
How does std::index_sequence_for<T... >() exactly work?
我有以下代码
#include<iostream>
#include <tuple>
#include<utility>
using namespace std::literals::string_literals;
template< typename tupleType, size_t ... inds >
void printTupleH(const tupleType& tuple, std::index_sequence<inds ...>){
((std::cout << std::get<inds>(tuple) << " "), ..., (std::cout << "\n"));
}
template< typename ... tupleElementsTypes>
void printTuple(const std::tuple<tupleElementsTypes ...>& tuple){
printTupleH< std::tuple<tupleElementsTypes ...>, std::index_sequence_for<tupleElementsTypes... >() >(tuple, std::index_sequence_for<tupleElementsTypes...>() );
}
int main() {
auto myTuple{std::make_tuple(1, 0.5, "erfevev"s, "dsfgsfgsf",'g',true,0x44,999999999999999999,9.999999999)};
printTuple(myTuple);
}
我不知道这个有什么问题
printTupleH< std::tuple<tupleElementsTypes ...>, std::index_sequence_for<tupleElementsTypes... >() > As the IDE says.
当我在没有任何模板参数的情况下离开函数调用时,推导效果很好。
我知道 std::index_sequence_for<tupleElementsTypes... >()
应该扩展到 0,1,2,..N-1
。那怎么了。
printTupleH
的模板定义需要 std::size_t
的列表。 std::index_sequence_for
创建单个 std::integer_sequence
(更准确地说,std::index_sequence
,它只是 std::size_t
整数序列的别名),而不是大小列表。
要明确添加扣除,您需要手动提供 std::size_t
的列表,每个索引一个 - 这首先违背了使用索引序列的要点!它旨在与模板推导一起使用。
我有以下代码
#include<iostream>
#include <tuple>
#include<utility>
using namespace std::literals::string_literals;
template< typename tupleType, size_t ... inds >
void printTupleH(const tupleType& tuple, std::index_sequence<inds ...>){
((std::cout << std::get<inds>(tuple) << " "), ..., (std::cout << "\n"));
}
template< typename ... tupleElementsTypes>
void printTuple(const std::tuple<tupleElementsTypes ...>& tuple){
printTupleH< std::tuple<tupleElementsTypes ...>, std::index_sequence_for<tupleElementsTypes... >() >(tuple, std::index_sequence_for<tupleElementsTypes...>() );
}
int main() {
auto myTuple{std::make_tuple(1, 0.5, "erfevev"s, "dsfgsfgsf",'g',true,0x44,999999999999999999,9.999999999)};
printTuple(myTuple);
}
我不知道这个有什么问题
printTupleH< std::tuple<tupleElementsTypes ...>, std::index_sequence_for<tupleElementsTypes... >() > As the IDE says.
当我在没有任何模板参数的情况下离开函数调用时,推导效果很好。
我知道 std::index_sequence_for<tupleElementsTypes... >()
应该扩展到 0,1,2,..N-1
。那怎么了。
printTupleH
的模板定义需要 std::size_t
的列表。 std::index_sequence_for
创建单个 std::integer_sequence
(更准确地说,std::index_sequence
,它只是 std::size_t
整数序列的别名),而不是大小列表。
要明确添加扣除,您需要手动提供 std::size_t
的列表,每个索引一个 - 这首先违背了使用索引序列的要点!它旨在与模板推导一起使用。