Как работает std :: index_sequence_for () точно работать? - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть следующий код

#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. Так что не так.

1 Ответ

2 голосов
/ 28 февраля 2020
Шаблон

printTupleH ожидает список std::size_t. std::index_sequence_for создает один std::integer_sequence (точнее, std::index_sequence, который является просто псевдонимом для целочисленных последовательностей std::size_t), а не список размеров.

Чтобы явно добавить вычет, вам нужно вручную предоставить список std::size_t, по одному для каждого индекса, что в первую очередь лишает смысла использовать последовательность индексов! Он предназначен для использования с шаблонными вычетами.

...