リストをループして要素のアドレスを取得しようとしていました。ただし、バリアント クラスを使用する場合、要素のアドレスはすべて同じです。
int main()
{
std::list<std::variant<std::list<int>, std::list<std::string>>> list_of_lists;
std::list<int> int_list = {1, 2, 3};
string a1 ="one";
std::list<std::string> string_list = {a1, "two", "three"};
list_of_lists.push_back(int_list);
list_of_lists.push_back(string_list);
// Iterate over all std::variant elements.
for (const auto& v : list_of_lists) {
// Check if the variant holds a list of ints.
if (std::holds_alternative<std::list<int>>(v)) {
// 'v' holds a list of ints.
for (auto i : std::get<std::list<int>>(v)) {
std::cout << i << ' ';
cout<<&i<<endl;
}
std::cout << '\n';
}
// Check if the variant holds a list of strings.
else if (std::holds_alternative<std::list<std::string>>(v)) {
// 'v' holds a list of strings.
for (const auto& s : std::get<std::list<std::string>>(v)) {
std::cout << s << ' ';
cout<<"string: "<<&std::get<std::list<std::string>>(v)<<endl;
cout<<&s<<endl;
}
std::cout << '\n';
}
}
cout<<"a1 address: "<<&a1<<endl;
}
output:
1 0x8dfcac
2 0x8dfcac
3 0x8dfcac
one string: 0x8f2890
0x8f27d0
two string: 0x8f2890
0x8f2810
three string: 0x8f2890
0x8f2850
a1 address: 0x8dfcc0
あなたとして ## 見出し ##
バリアント std ライブラリが元の変数自身のアドレスを取得できないようです。したがって、リンクされたリストをループしようとするたびに、マザー リスト内の要素のすべてのアドレスが変更されます。したがって、私は表示することしかできず、マザー リンク リスト内のそれらのリンク リストをプッシュバックすることはできません。私の友人の 1 人が、C++ はすべてポインターに関するものであり、Java にはポインターがあるため Java が嫌いだと言いました。そして今、このライブラリでは C++ でポインターを使用できません。この問題は、boot:: バリアント、std:: オプション、またはポリモーフィズムによって解決できると聞いています。しかし、これらがどのように機能するのかわかりません。とにかく、このライブラリがアドレスのアイデアに触れていない理由は、どの割り当てがどのように行われるかについて意見が分かれているからだと言う人もいます。