【问题标题】:How does std::index_sequence_for<T... >() exactly work?std::index_sequence_for<T... >() 究竟是如何工作的?
【发布时间】:2020-02-27 23:14:54
【问题描述】:

我有以下代码

#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&lt;tupleElementsTypes... &gt;() 应该扩展为 0,1,2,..N-1 。那怎么了。

【问题讨论】:

  • 请注意,在 C++17 中,您可能会使用 std::apply([](const auto&amp;... args){ (std::cout &lt;&lt; args &lt;&lt; " "), ..., (std::cout &lt;&lt; "\n"); }, myTuple);

标签: c++ c++17 template-meta-programming index-sequence


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-26
    • 2021-08-15
    • 2012-06-08
    • 2011-10-11
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    相关资源
    最近更新 更多