gpt4 book ai didi

c++ - 连接元组

转载 作者:行者123 更新时间:2023-11-30 05:36:00 25 4
gpt4 key购买 nike

我写了一个(坏的)函数来解包元组

  template<class tuple_head_t, size_t... HeadIndices, class tuple_tail_t, size_t... TailIndices>
decltype(auto) concat_tuples_concat(tuple_head_t&& head, index_sequence<HeadIndices...>, tuple_tail_t&& tail, index_sequence<TailIndices...>) noexcept {
return make_tuple(get<HeadIndices>(forward<tuple_head_t>(head))..., get<TailIndices>(forward<tuple_tail_t>(tail))...);
}


template<class tuple_t, class... tuple_ts>
decltype(auto) concat_tuples(tuple_t&& t1, tuple_ts&&... ts) noexcept {
return concat_tuples_concat(
forward<tuple_t>(t1),
make_index_sequence<tuple_size<remove_reference_t<tuple_t>>::value>(),
concat_tuples(forward<tuple_ts>(ts)...),
make_index_sequence<tuple_size<decltype(concat_tuples(forward<tuple_ts>(ts)...))>::value>()
);
}


template<>
decltype(auto) concat_tuples<>() noexcept {
return make_tuple();
}

它抛出一个编译时错误。

error: template-id ‘concat_tuples<>’ for ‘decltype(auto) sprincle::concat_tuples()’ does not match any template declaration
decltype(auto) concat_tuples<>() noexcept {
^

我闻到编译器的返回类型有问题。两个 decltype(auto) 评估为不同的类型,因此特化不起作用。后来我发现有一个标准库函数可以连接元组 tuple_cat。我试图查看实现 (GCC 5.2.0) 以找出返回类型是如何推导出来的,但这对我来说太神秘了,无法理解。

如果您碰巧知道该怎么做,您介意分享一下吗?

最佳答案

您的空案例试图为不存在的模板声明提供完整的特化(声明的主模板至少有一个参数)。与其将空案例作为完整的模板特化,不如将其作为单独的重载并将其定义在递归案例之上:

decltype(auto) concat_tuples() noexcept {
return make_tuple();
}

template<class tuple_t, class... tuple_ts>
decltype(auto) concat_tuples(tuple_t&& t1, tuple_ts&&... ts) noexcept {
return concat_tuples_concat(
forward<tuple_t>(t1),
make_index_sequence<tuple_size<remove_reference_t<tuple_t>>::value>(),
concat_tuples(forward<tuple_ts>(ts)...),
make_index_sequence<tuple_size<decltype(concat_tuples(forward<tuple_ts>(ts)...))>::value>()
);
}

关于c++ - 连接元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33653705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com