невозможно получить адрес элемента в списке по варианту - PullRequest
0 голосов
/ 02 июня 2019

Я пытался зациклить список и получить адрес элемента.Но все адреса элементов одинаковы при использовании варианта класса.

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 не может получить собственный адрес исходной переменной,Таким образом, каждый раз, когда я пытаюсь перебрать связанный список, все адреса элементов в родительском списке меняются.Таким образом, я могу только отображать и не могу отодвинуть те связанные списки в связанном списке матери.Один из моих друзей сказал мне, что c ++ - это все о указателе, и он ненавидит Java, потому что у него есть указатель!И теперь я не могу использовать указатель в C ++ с этой библиотекой.Я слышал, что эта проблема может быть решена с помощью загрузки :: варианта, std :: необязательно или полиморфизм.Но я понятия не имею, как они работают.Во всяком случае, некоторые люди сказали, что причина, по которой эта библиотека не затрагивает идею адресации, состоит в том, что у них есть разногласие относительно того, какое назначение

1 Ответ

1 голос
/ 02 июня 2019

Для цикла int вы создали локальную переменную и берете ее адрес.

for (auto i : std::get<std::list<int>>(v))  // local variable, same address each time

должно быть

for (auto& i : std::get<std::list<int>>(v)) // reference, refers to the actual element

Это не имеет ничего общего с вариантами.

Для цикла string вы уже используете ссылку.

for (const auto& s : std::get<std::list<std::string>>(v)) // reference

Вот почему все работает как положено.

...