我正在尝试遍历一个对象的成员std::vector
,使用一个包含成员向量引用的std::tuple
成员。
一个简单的例子可以像这样:
#include <iostream>
#include <vector>
#include <tuple>
struct S {
std::vector<int> a;
std::vector<double> b;
std::tuple<std::vector<int>&, std::vector<double>&> tup{a, b};
};
int main() {
S s;
s.a = {2, 3};
s.b = {5.1, 6.1};
std::apply([&](auto&... v){
((std::cout << v.size()), ...);
}, s.tup);
}
这个可以工作,但问题在于,如果我将对象
s
分配给 std 容器,则 tup
持有的引用可能会成为悬空引用,例如: std::map<int, S> myMap;
myMap[3] = s; // s.a and s.b has been copied to different addresses.
auto& v = std::get<0>(myMap.at(3).tup); // -> still refers to the previous s.a, not the copied one.
有没有什么好的方法来解决这个问题?我希望引用指向新复制的成员,而不是原始成员,以便可以使用成员元组迭代新对象的成员向量。
(在问了this问题之后,写下了这个问题。)
tup
,而是要有一个成员函数tup()
,它返回带有引用的元组。你可以方便地使用std::tie()
来创建它。 - j6tstd::tie
很方便,它等同于返回元组tuple<vector<int>&,...>tup{a,b,...}
。3)参见这个答案,了解std::tie
和std::forward_as_tuple
之间的差异的好解释。 - starriet