Я пытаюсь реализовать общий связанный список и итератор связанного списка на С++. У меня есть структура узла следующим образом
template <typename T>
struct Node
{
T m_data;
Node<T>* m_next;
};
У меня также есть итератор связанного списка, который является шаблоном, поэтому он может генерировать как обычные, так и const
итераторы.
template <typename NodeType>
class LinkedListIterator
{
private:
NodeType* m_node;
public:
LinkedListIterator(NodeType* n);
T& operator*() const;
};
Мой вопрос: как правильно объявить функцию operator*()
? Я ожидаю, что что-то вроде следующего должно работать
LinkedListIterator<const Node<T>> my_iter(some_node_pointer);
*my_iter = new_value; // should not work
Я понимаю, что возвращать T
в operator*()
не имеет смысла, так как этот класс не имеет доступа к имени типа в классе Node
.
Я нашел обходной путь, создав псевдоним для типа внутри класса Node
вот так
template <typename T>
struct Node
{
typedef T type_value;
// rest of Node class...
};
и теперь я могу сделать следующее в своем классе итератора
template <typename NodeType>
class LinkedListIterator
{
public:
typename NodeType::type_value& operator*() const;
};
Кажется, это работает и возвращает правильное значение. Так что мой вопрос действительно должен быть, это лучший способ реализовать это? Нужно ли мне иметь typedef
для создания псевдонима, чтобы я мог использовать этот тип? Или есть способ определить тип внутри класса LinkedListIterator
?
typedef
(или лучшеusing
в C++11 и более поздних версиях) — это один из способов справиться с этим, да. Другой способ — просто использоватьauto
, например:auto& operator*() const { return m_node->m_data; }
- person Remy Lebeau   schedule 14.08.2020value_type
каждого контейнера C++ и о том, откуда он на самом деле берется. Ты угадал. Псевдоним. - person Sam Varshavchik   schedule 15.08.2020boost::typeindex::type_id_with_cvr<decltype(arg) or T>().pretty_name();
полезно узнать, какой тип T и param. - person BAKE ZQ   schedule 15.08.2020