Информация об изменениях

Сообщение Re[5]: Наследовать stl::list<T> as string<T> от 27.11.2022 11:33

Изменено 27.11.2022 11:52 rg45

Re[5]: Наследовать stl::list<T> as string<T>
Здравствуйте, Su34, Вы писали:

S>Здравствуйте, rg45, Вы писали:

S>
R>template <class T>
R>>class basic_text : public std::list<T>
R>>{
R>>  using list::list;
R>>  using list = std::list<T>;
R>>};
R>>template <class T>
R>>using list_of_string = basic_text<std::basic_string<T>>;


S>Спасибо, работает!


Это значит, что у вас не самый новый компилятор. Не следовало менять эти объявления местами, на современных компиляторах в этом порядке не скомпилируется. Ну и спецификацию public для этих объявлений лучше указать явно, раз уж вы заменили "struct" на "class".

S>А насчет зачем нужен basic_text, согласитесь basic_text::load(szFlie) выглядит эстетичнее чем void load(std::list &list, const char* szFile) !!!


На самом деле, если написать выражения правильно, то разница между вариантами мизерная:

  text.load(szFile);
  load(text, szFile);

Только второй вариант лучше заточен для обобщенного программирования. Ну да ладно, речь же сейчас не об этом.

Для вас в таком случае определение list_of_string является лишним, можно все сделать сразу в определении basic_text. Зачем же плодить лишние имена?

http://coliru.stacked-crooked.com/a/221c3d39454a6edc

#include <iostream>
#include <list>
#include <string>

template <class T>
class basic_text : public std::list<std::basic_string<T>>
{
public:
  using list = std::list<std::basic_string<T>>;
  using list::list;
};

int main()
{
  const basic_text<char> list { "one", "two", "three" };

  if (!list.empty())
  {
    for (const auto& s : list)
    {
      std::cout << s << std::endl;
    }
  }
}
Re[5]: Наследовать stl::list<T> as string<T>
Здравствуйте, Su34, Вы писали:

S>Здравствуйте, rg45, Вы писали:

S>
R>template <class T>
R>>class basic_text : public std::list<T>
R>>{
R>>  using list::list;
R>>  using list = std::list<T>;
R>>};
R>>template <class T>
R>>using list_of_string = basic_text<std::basic_string<T>>;


S>Спасибо, работает!


Это значит, что у вас не самый новый компилятор. Не следовало менять using-объявления местами, на современных компиляторах в этом порядке не скомпилируется. Ну и спецификацию public для этих объявлений лучше указать явно, раз уж вы заменили "struct" на "class".

S>А насчет зачем нужен basic_text, согласитесь basic_text::load(szFlie) выглядит эстетичнее чем void load(std::list &list, const char* szFile) !!!


На самом деле, если написать выражения правильно, то разница между вариантами мизерная:

  text.load(szFile);
  load(text, szFile);

Только второй вариант лучше заточен для обобщенного программирования. Ну да ладно, речь же сейчас не об этом.

Для вас в таком случае определение list_of_string является лишним, можно все сделать сразу в определении basic_text. Зачем же плодить лишние имена?

http://coliru.stacked-crooked.com/a/221c3d39454a6edc

#include <iostream>
#include <list>
#include <string>

template <class T>
class basic_text : public std::list<std::basic_string<T>>
{
public:
  using list = std::list<std::basic_string<T>>;
  using list::list;
};

int main()
{
  const basic_text<char> list { "one", "two", "three" };

  if (!list.empty())
  {
    for (const auto& s : list)
    {
      std::cout << s << std::endl;
    }
  }
}