Как получить доступ к выбранной пользователем структурной переменной C

#c #struct #pass-by-reference

Вопрос:

Я использую функцию для печати данных из связанного списка, узлы списка имеют 2 переменные, к которым можно получить доступ, данные или индекс. Я хочу добавить параметр в функцию print (), который позволяет пользователю вызывать имя переменных в узле, который они хотят вывести, я слышал о передаче по ссылке, и я почти уверен, что это то, что я хочу сделать, но не нашел никаких ресурсов, которые действительно работают для моего кода.

(просто я хочу передать имя переменной функции).

вот мой код:

 struct Node {
    int data;
    int index;
    Node *next;
}

Node *_current;
Node *_next;
Node *_head;
Node *_temp;
Node *_tail;
Node *_last;
// all this is handled correctly

void print(*variable name*) {
   Node *n = _head;
   while (n->next != nullptr) {
       std::cout << n-> *variable name* << std::endl;
       n = n->next;
   }
}
 

p.s: имя переменной не обязательно является указателем, а просто (буквально) ссылается на параметр имени переменной, который я хочу добавить.

этот код работает, если я поменяю имя переменной на ‘std::cout << n->данные < n->< (кстати, весь код представлен не только частями, необходимыми для объяснения того, что я хочу изменить)

любая полезная информация будет очень признательна, заранее благодарю вас. 🙂

Ответ №1:

p.s: имя переменной не обязательно является указателем

Но это указатель. Указатель на элемент, в частности:

 void print(int Node::*member) {
   Node *n = _head;
   while (n->next != nullptr) {
       std::cout << n->*member << std::endl;
       n = n->next;
   }
}
 

Он будет вызван как либо

 print(amp;Node::data);
 

или

 print(amp;Node::index);
 

Комментарии:

1. большое вам спасибо, Сэм, это решило мою проблему именно так, как я хотел!:), Хорошего дня.

2. Чтобы быть супер техническим, указатели на элементы не являются указателями, несмотря на то, как они называются 🙂

Ответ №2:

Вы можете передать его в виде строки.

 void print(const stringamp; str) {

   Node *n = _head;
   if(str.compare("index")==0){
       while (n->next != nullptr) {
           std::cout << n->index << std::endl;
           n = n->next;
       }
   }
   else if(str.compare("data")==0){
       while (n->next != nullptr) {
           std::cout << n->data << std::endl;
           n = n->next;
       }
   }

}
 

Комментарии:

1. Хотя это верно, вы также можете передать логическое значение или перечисление и избавиться от сравнения строк. Кроме того, немного странно сравнивать строку с помощью сравнения, а не ==

2. это действительно работает,однако я ищу решение, которое работает бесконечно, без необходимости использовать массивный цикл switch/ if, else. хотя спасибо за помощь