Size: a a a

2020 August 31

M

Michael in C++ Together 2.0
В Си тоже принято, что одна структура делает ровно одно действие?

Будет ли плохим решением использовать одну гибкую структуру под разные ф-ции, но которые по сути делают одно и то же, только разными способами?

Допустим, одна гибкая структура для вектора, мапы, очереди и т.д и т.д?
источник

IZ

Ilia Zviagin in C++ Together 2.0
Michael
В Си тоже принято, что одна структура делает ровно одно действие?

Будет ли плохим решением использовать одну гибкую структуру под разные ф-ции, но которые по сути делают одно и то же, только разными способами?

Допустим, одна гибкая структура для вектора, мапы, очереди и т.д и т.д?
Ничего плохого именно в этом нет.
источник

RM

Roy Mustang in C++ Together 2.0
Michael
В Си тоже принято, что одна структура делает ровно одно действие?

Будет ли плохим решением использовать одну гибкую структуру под разные ф-ции, но которые по сути делают одно и то же, только разными способами?

Допустим, одна гибкая структура для вектора, мапы, очереди и т.д и т.д?
У меня такая структура Util называется и имеет статические методы
источник

🦊

🦊fox.cpp in C++ Together 2.0
Michael
В Си тоже принято, что одна структура делает ровно одно действие?

Будет ли плохим решением использовать одну гибкую структуру под разные ф-ции, но которые по сути делают одно и то же, только разными способами?

Допустим, одна гибкая структура для вектора, мапы, очереди и т.д и т.д?
Только вот, какую гибкую структуру можно использовать и для мапы и для вектора..
источник

RM

Roy Mustang in C++ Together 2.0
🦊fox.cpp
Только вот, какую гибкую структуру можно использовать и для мапы и для вектора..
Шаблон пилишь и юзаешь if constexpr + is_same
источник

RM

Roy Mustang in C++ Together 2.0
В итоге можно 1 функцией обойтись
источник

🦊

🦊fox.cpp in C++ Together 2.0
Roy Mustang
Шаблон пилишь и юзаешь if constexpr + is_same
Блядь, не надо
источник

M

Michael in C++ Together 2.0
🦊fox.cpp
Только вот, какую гибкую структуру можно использовать и для мапы и для вектора..
Есть обычные поля: указатель на войд для хранения данных, размер, размер смещения данных и т.д.

Но помимо этого имеется указатель на войд, который будет указывать на расширение, где будут храниться специфичные для мапы и т.д данные.

Вот в чем идея
источник

RM

Roy Mustang in C++ Together 2.0
🦊fox.cpp
Блядь, не надо
Почему нет?
источник

RM

Roy Mustang in C++ Together 2.0
Michael
Есть обычные поля: указатель на войд для хранения данных, размер, размер смещения данных и т.д.

Но помимо этого имеется указатель на войд, который будет указывать на расширение, где будут храниться специфичные для мапы и т.д данные.

Вот в чем идея
void* ptr, size_t size, size_t offset ?
источник

RM

Roy Mustang in C++ Together 2.0
Ты что сериализатор пишешь?
источник

M

Michael in C++ Together 2.0
Michael
Есть обычные поля: указатель на войд для хранения данных, размер, размер смещения данных и т.д.

Но помимо этого имеется указатель на войд, который будет указывать на расширение, где будут храниться специфичные для мапы и т.д данные.

Вот в чем идея
Эдакий pNext - видел такой в вулкане и в одной книге
источник

M

Michael in C++ Together 2.0
Ось тут
источник

M

Michael in C++ Together 2.0
источник

M

Michael in C++ Together 2.0
Roy Mustang
Ты что сериализатор пишешь?
Можно сказать, пожалуй, что да.

В будущем есть несколько желаемых проектов к реализации, где обязательно потребуется Си.

Для тренировки решил сделать несколько удобных контейнеров из плюсов. Скорее всего не буду ограничиваться лишь контейнерами.

Ну и потом, когда сделаю хотя бы один контейнер, кину куда то и предложу людям отчитать меня за архитектурные проёбы
источник

RM

Roy Mustang in C++ Together 2.0
Michael
Можно сказать, пожалуй, что да.

В будущем есть несколько желаемых проектов к реализации, где обязательно потребуется Си.

Для тренировки решил сделать несколько удобных контейнеров из плюсов. Скорее всего не буду ограничиваться лишь контейнерами.

Ну и потом, когда сделаю хотя бы один контейнер, кину куда то и предложу людям отчитать меня за архитектурные проёбы
Если у тебя указатель void, ты можешь создать вектор из указателей на абстрактный класс, а от абстрактного класса унаследоваться с помощью шаблонного класса
источник

RM

Roy Mustang in C++ Together 2.0
в абстрактном методе создать виртуальный метод GetData() и возвращать void*
источник

RM

Roy Mustang in C++ Together 2.0
в итоге получить .data() контейнеров,, который кастанут в void*
источник

RM

Roy Mustang in C++ Together 2.0
Это будет выглядеть что-то типа
class IDataManager {
public:
  virtual void* GetData() = 0;
};

template <typename Container>
class Serializer {
public:
  void* GetData() override {
      return static_cast<void*>(m_Data.data());
  }
private:
  Container m_Data;
};

int main() {
  std::vector<IDataManager*> manager;
  manager.push_back(new Serializer<std::map<int, int>>);
};
источник

RM

Roy Mustang in C++ Together 2.0
Пример не полный, но суть объясняет
источник