c++ - c++ 中没有 std::tuple 的 std::iterator 有什么原因吗?

标签 c++ iterator tuples

std::tuple 有一个std::iterator 似乎很自然。但是它没有实现,所以程序员实现了自己的版本。例如,一个位于 Jonathan Müller's Blog。 .

我是否忽略了什么?有什么理由没有 tuple_iterator 的“官方版本”吗?

最佳答案

std::tuple 不是容器,至少在标准库容器的意义上不是。它不能用通常的方法迭代,因为它包含不同类型的对象。标准容器是同构容器,而 std::tuple 是异构容器。

这并不意味着你不能遍历一个元组,但它非常麻烦而且你不能使用既定的语法:

假设您想像遍历 std::vector 这样的容器一样遍历元组:

std::tuple<int, std::string, bool> t = {...};

for (auto it = t.begin(); it != t.end(); ++it)
{
    auto elem = *it; // this cannot work the same way as with containers
                     // because each element is of a different type
}

您可以做几件事。使用包含容器类型的 std::variant 的迭代器。访问下面的真实对象并不那么容易。而且这种迭代器在标准库中任何需要迭代器的地方都不能使用,至少在没有一些额外工作的情况下是这样。

还有一项关于元编程(反射、内省(introspection))的提案的工作,该提案具有(或具有、未遵循)以下语法:

std::tuple<int, std::string, bool> t = {...};

// something like this (can't remember the syntax exactly):
for constexpr ... (auto elem : t)
{
    // only the common set of operations permitted with `elem`
    // e.g. this is valid
    std::cout << elem << std::endl;

    // this is invalid:
    //elem.size();
}

这实际上会在编译时展开,导致以下代码:

std::tuple<int, std::string, bool> t = {...};

{
    int elem = std::get<0>(t);
    std::cout << elem << std::endl;
}
{
    std::string elem = std::get<1>(t);
    std::cout << elem << std::endl;
}
{
    bool elem = std::get<2>(t);
    std::cout << elem << std::endl;
}

关于c++ - c++ 中没有 std::tuple 的 std::iterator 有什么原因吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61345033/

相关文章:

python - 如何从数据框 Pandas 制作列表列表?

c++ - 显式默认/删除的函数可以在 ref 限定符上重载吗?

c++ - 全局变量 "things"和 "single"?

nullpointerexception - [WSO2 ESB][4.9.0] NPE 在发回时进行迭代

python - 如何在不更改其预查询状态的情况下在python中查询迭代器

python - 如何以pythonic方式将元组一分为二

c++ - 代理 DLL 中未解析的外部符号

c++ - Boost spirit 解析器的 Fortran 打印 double

c++ - 如何将基于迭代器的 for 循环重写为基于范围的循环 (C++11)

Python元组到C数组