首页 > 解决方案 > std::index_sequence_for 如何() 到底有没有用?

问题描述

我有以下代码

#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. 那么有什么问题。

标签: c++c++17template-meta-programmingindex-sequence

解决方案


printTupleH的模板定义需要一个std::size_t. std::index_sequence_for创建一个std::integer_sequence(更准确地说是 a std::index_sequence,它只是 的整数序列的别名std::size_t),而不是大小列表。

要显式添加推论,您需要手动提供一个 列表std::size_t,每个索引一个 - 这首先破坏了使用索引序列的意义!它旨在与模板扣除一起使用。


推荐阅读