gpt4 book ai didi

c++ - std::get() 如何与 std::tuple 一起工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:36 28 4
gpt4 key购买 nike

尝试制作 std::get<N>(std::tuple) 之后我自己的方法,我不太确定它是如何被编译器实现的。我知道std::tuple有一个这样的构造函数:

tuple(Args&&... args);

但是args...到底是什么?分配给?我认为这对于了解如何使用很有用 std::get()有效,因为需要将参数放在某个地方才能访问它们。

最佳答案

这是 tuple 的粗略玩具实现-喜欢上课。

首先,一些元编程样板,用于表示整数序列:

template<int...> struct seq {};
template<int max, int... s> struct make_seq:make_seq< max-1, max-1, s... > {};
template<int... s> struct make_seq<0, s...> {
typedef seq<s...> type;
};
template<int max> using MakeSeq = typename make_seq<max>::type;

接下来是真正存储数据的标记类:

template<int x, typename Arg>
struct foo_storage {
Arg data;
};

每当我们想在编译时将数据与某个标签(在本例中为整数)相关联时,这种标记技术就是一种常见模式。标签(此处为 int)通常不会在存储中的任何地方使用,它仅用于标记存储。

foo_helper将一个序列和一组参数解压成一堆 foo_storage ,并以线性方式继承它们。这是一种非常常见的模式——如果您经常这样做,您最终会创建元编程工具来为您完成这项工作:

template<typename Seq, typename... Args>
struct foo_helper {};
template<int s0, int... s, typename A0, typename... Args>
struct foo_helper<seq<s0, s...>, A0, Args...>:
foo_storage<s0, A0>,
foo_helper<seq<s...>, Args...>
{};

我的原油tuple类型,foo ,创建一系列索引和参数的包,并将其传递给上面的帮助程序。助手然后创建一堆包含父类的标记数据:

template<typename... Args>
struct foo: foo_helper< MakeSeq<sizeof...(Args)>, Args... > {};

我删除了 foo 正文中的所有内容,因为它不需要实现 get .

get非常简单:我们采用存储类型(不是元组类型)和显式 template争论 N消除 foo_storage<n, T> 中的哪一个歧义我们要访问。现在我们有了存储类型,我们只需返回数据字段:

template<int N, typename T>
T& get( foo_storage<N, T>& f )
{ return f.data; }
template<int N, typename T>
T const& get( foo_storage<N, T> const& f )
{ return f.data; }

我们正在使用 C++ 语言的重载机制来完成繁重的工作。当您使用类实例调用函数时,该实例作为每个父类都会被检查以查看是否可以匹配它们中的任何一个。随着N固定,只有一个父类是有效参数,因此自动推导父类(因此 T )。

最后,一些基本的测试代码:

#include <iostream>

int main() {
foo<int, double> f;
get<0>( f ) = 7;
get<1>( f ) = 3.14;
std::cout << get<0>(f) << "," << get<1>(f) << "\n";
}

关于c++ - std::get() 如何与 std::tuple 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17178499/

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