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 的迭代器。访问下面的真实对象并不容易。而且这种迭代器在标准库中需要迭代器的任何其他地方都无法使用,至少在没有一些额外工作的情况下不能使用。
还有一项关于元编程(反射、内省)的提案的工作,该提案具有(或曾经、未遵循)以下语法:
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;
}