前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >std::tuple 学习笔记

std::tuple 学习笔记

作者头像
Kindem
发布2022-08-12 14:15:00
4650
发布2022-08-12 14:15:00
举报
文章被收录于专栏:Kindem的博客Kindem的博客

std::tuple 是泛化的 std::pair,用于存储一组任意类型的数据,可以通过 std::get 来访问其元素:

代码语言:javascript
复制
int main(int argc, char* argv[])
{
    std::tuple<int, double, std::string> tuple = std::make_tuple(1, 2.0, "hello");
    std::cout << std::get<0>(tuple) << std::endl;
    std::cout << std::get<1>(tuple) << std::endl;
    std::cout << std::get<2>(tuple) << std::endl;
}

也可以使用类型来查找元素:

代码语言:javascript
复制
int main(int argc, char* argv[])
{
    std::tuple<int, double, std::string> tuple = std::make_tuple(1, 2.0, "hello");
    std::cout << std::get<int>(tuple) << std::endl;
    std::cout << std::get<double>(tuple) << std::endl;
    std::cout << std::get<std::string>(tuple) << std::endl;
}

如果 std::tuple 中具有两个以上的相同类型的元素,则不能使用该类型进行查找:

代码语言:javascript
复制
int main(int argc, char* argv[])
{
    std::tuple<int, int, std::string> tuple = std::make_tuple(1, 2, "hello");
    // 编译期错误
    std::cout << std::get<int>(tuple) << std::endl;
    std::cout << std::get<int>(tuple) << std::endl;
    std::cout << std::get<std::string>(tuple) << std::endl;
}

可以使用 std::tie 来对 std::tuple 进行解包:

代码语言:javascript
复制
int main(int argc, char* argv[])
{
    std::tuple<int, double, std::string> tuple = std::make_tuple(1, 2.0, "hello");

    int a;
    double b;
    std::string c;
    std::tie(a, b, c) = tuple;

    std::cout << a << std::endl;
    std::cout << b << std::endl;
    std::cout << c << std::endl;
}

可以使用 std::tuple_cat 来合并多个 std::tuple

代码语言:javascript
复制
int main(int argc, char* argv[])
{
    auto tuple1 = std::make_tuple(1, 2.0);
    auto tuple2 = std::make_tuple("hello");
    auto tuple = std::tuple_cat(tuple1, tuple2);

    int a;
    double b;
    std::string c;
    std::tie(a, b, c) = tuple;

    std::cout << a << std::endl;
    std::cout << b << std::endl;
    std::cout << c << std::endl;
}

可以使用 std::tuple_size 来获取某个类型的 std::tuple 的长度:

代码语言:javascript
复制
int main(int argc, char* argv[])
{
    std::cout << std::tuple_size<std::tuple<int, double>>::value << std::endl;
}

也可以直接使用 std::tuple_size_v 替代:

代码语言:javascript
复制
int main(int argc, char* argv[])
{
    std::cout << std::tuple_size_v<std::tuple<int, double>> << std::endl;
}

通常用于元编程中获取模板参数中 std::tuple 的长度:

代码语言:javascript
复制
template <typename... Args>
size_t GetTupleSize(const std::tuple<Args...>& tuple)
{
    return std::tuple_size_v<std::tuple<Args...>>;
}

int main(int argc, char* argv[])
{
    auto tuple = std::make_tuple(1, 2.0);
    std::cout << GetTupleSize(tuple) << std::endl;
}

可以在元编程中使用 std::tuple_element_t 提取 std::tuple 中元素的类型,下面是一个完整的例子:

代码语言:javascript
复制
template <uint32_t I, typename... Args>
std::tuple_element_t<I, std::tuple<Args...>> GetTupleValue(const std::tuple<Args...>& tuple)
{
    return std::get<I>(tuple);
}

int main(int argc, char* argv[])
{
    auto tuple = std::make_tuple(1, 2, "hello");
    std::cout << GetTupleValue<0>(tuple) << std::endl;
    std::cout << GetTupleValue<1>(tuple) << std::endl;
}

可以使用 std::forword_tuple 来将模板可变参转换成一个 std::tuple

代码语言:javascript
复制
template <typename... Args>
auto MakeTuple(const Args&... args)
{
    return std::forward_as_tuple(args...);
}

int main(int argc, char* argv[])
{
    auto tuple = MakeTuple(1, 2.0, "hello");

    std::cout << std::get<0>(tuple) << std::endl;
    std::cout << std::get<1>(tuple) << std::endl;
    std::cout << std::get<2>(tuple) << std::endl;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档