Связанный список шаблонов c ++, который может содержать любые типы - PullRequest
0 голосов
/ 09 ноября 2018

Как определить список, который может содержать различные типы объектов в c ++, как список python?Я попробовал следующий код

#include <iostream>

template< typename t >
struct Node {
    t val;
    Node *next;
};

int main() {
    Node<int> a;
    a.val = 1;
    Node<char> b;
    b.val = 'b';
    a.next = &b;
    b.next = NULL;
}

Но компилятор выдает следующую ошибку:

main.cpp:14:15: error: cannot convert 'Node<char>*' to 'Node<int>*' in 
assignment
     a.next = &b;
           ^

1 Ответ

0 голосов
/ 09 ноября 2018

Есть несколько проблем с этим кодом, во-первых, следующий член Node не имеет определенного типа шаблона, обычно в этом случае, если вы хотите создать связанный список одного универсального типа, вы должны сделать что-то вроде Node<t>* next. Вторым является тот факт, что вы назначаете то, что кажется Узлом *, Узлу *.

Если вы пытаетесь создать связанный список разных типов, вы не сможете сделать это таким образом. Проще говоря, причина в том, что вы должны передать тип для аргумента t, и поэтому каждый узел должен иметь определенный тип. Назначение шаблонных классов состоит не в том, чтобы позволить пользователю выделять какой-либо универсальный тип, а в упрощении повторяющейся реализации класса, позволяя передавать тип в качестве параметра. Например: List<int> против List<char> просто избавляет вас от необходимости создавать IntList класс и CharList класс.

Если вы хотите, чтобы поведение динамически размещаемых типов в одном и том же массиве сохранялось, это не так просто. Я бы порекомендовал взглянуть на типы c ++ 17 std::any и std::variant или, если более старая версия языка, типы boost boost::any и boost::variant из библиотеки boost. Другие способы сделать это без стандартных библиотек - использовать полиморфизм или void*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...