gpt4 book ai didi

c++ - 有人可以解释一下 "indices trick"吗?

转载 作者:IT老高 更新时间:2023-10-28 22:38:05 27 4
gpt4 key购买 nike

我注意到在 pretty-print 元组的上下文中提到了“索引技巧”。听起来很有趣,所以我关注了the link .

好吧,那并不顺利。我理解这个问题,但真的无法理解发生了什么。为什么我们甚至需要任何东西的索引?那里定义的不同功能对我们有何帮助?什么是“裸”?等等

有人可以为参数包和可变元组方面的专家详细介绍该内容吗?

最佳答案

问题是:我们有一个 std::tuple<T1, T2, ...>我们有一些功能f我们可以调用每个元素,其中 f返回 int ,我们希望将这些结果存储在一个数组中。

让我们从一个具体的案例开始:

template <typename T> int f(T ) { return sizeof(T); }

std::tuple<int, char, double> tup{42, 'x', 3.14};
std::array<int, 3> arr{ f(std::get<0>(tup)),
f(std::get<1>(tup)),
f(std::get<2>(tup)) );

除了写出所有这些get s 充其量是不方便和多余的,最坏的情况是容易出错。

首先我们需要包含 std::index_sequence 的实用程序 header 和 std::make_index_sequence :

#include <utility>

现在,假设我们有一个类型 index_sequence<0, 1, 2> .我们可以使用它来将该数组初始化折叠为可变参数包扩展:

template <typename Tuple, size_t... Indices>
std::array<int, sizeof...(Indices)>
call_f_detail(Tuple& tuple, std::index_sequence<Indices...> ) {
return { f(std::get<Indices>(tuple))... };
}

这是因为在函数内部,f(std::get<Indices>(tuple))...扩展到 f(std::get<0>(tuple)), f(std::get<1>(tuple)), f(std::get<2>(tuple)) .这正是我们想要的。

问题的最后一个细节就是生成特定的索引序列。 C++14 实际上为我们提供了一个名为 make_index_sequence 的实用程序

template <typename Tuple>
std::array<int, std::tuple_size<Tuple>::value>
call_f(Tuple& tuple) {
return call_f_detail(tuple,
// make the sequence type sequence<0, 1, 2, ..., N-1>
std::make_index_sequence<std::tuple_size<Tuple>::value>{}
);
}

而您链接的文章只是解释了如何实现这样的元功能。

Bare可能类似于,来自 Luc Danton's answer :

template<typename T>
using Bare = typename std::remove_cv<typename std::remove_reference<T>::type>::type;

关于c++ - 有人可以解释一下 "indices trick"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31463388/

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