Constantine
в любом случае 95% include-директив в моем примере генерируются, так что с этим проблем не будет
Evgenii
🤔
🐙 Antony
Так что придётся mv iostream impl/iostream echo "import std.iostream\n#pragma once" >iostream ???? sed -i 's/include/import/g' impl/iostream ???? make module iostream from impl/iostream И разбираться с проблемами
Constantine
а этого я не знал
ну там видимо проблема, что непонятно, откуда цеплять
Evgenii
но ведь импортировать и инклюдить одновременно смысла нет?
🐙 Antony
но ведь импортировать и инклюдить одновременно смысла нет?
Нет, но при большой кодовой базе и сторонних библиотеках это случится
Constantine
портировать все или ничего
Вот это проблема. Перейти плавно будет практически невозможно.
🐙 Antony
ну только подменяя заголовочный файл на файл импортирующий модуль (как в псевдокоде выше)
Constantine
Так что придётся mv iostream impl/iostream echo "import std.iostream\n#pragma once" >iostream ???? sed -i 's/include/import/g' impl/iostream ???? make module iostream from impl/iostream И разбираться с проблемами
В моей уютненькой MSVCPP у меня всё std проходит через stdafx, который дергает общий для всех проектов заголовочный файл
Constantine
Интересно, а импорт модуля можно же include-нуть?
Constantine
Да :)
Ну вот, std я уже подключил во всех файлы как модуль)
Constantine
А в какой точке происходит запись инстанцированных шаблонов?
Constantine
Она привязывается к импортирующему модулю?
Evgenii
ох
Constantine
Или все-таки к экспортирующему?
🐙 Antony
Это детали реализации.... тут уж кто во что горазд и у кого получится лучше. У MSVC есть единое место для хранения инстансов, у GCC нет
Constantine
Это детали реализации.... тут уж кто во что горазд и у кого получится лучше. У MSVC есть единое место для хранения инстансов, у GCC нет
Хм... то есть инстанцирование в разных модулях одного шаблона по-разному всё еще no-diagnosis ODR violation?
Constantine
А что происходит с inline-функциями/переменными? Их экспортирует модуль?
Constantine
У меня пока получается что-то вроде идеи свалить весь код в один большой .cpp файл 😆
Constantine
Что это по-сути вот так работает
Anonymous
В некоторых языках все гораааздо хуже
🦥Alex Fails
Ну а если перегрузить на базовый тип
ep
Вопрос по cmake, есть решение лучше для такого случая? # Find VTK # Maybe we set VTK_DIR location set(_VTK_DIR ${VTK_DIR}) find_package(VTK 8.0 QUIET) if(NOT VTK_FOUND) # Restore VTK_DIR (CMake overwrites it) set(VTK_DIR ${_VTK_DIR}) find_package(VTK 7.0 REQUIRED) endif() Проблема в том, что find_package не будет работать с разными major-версиями. Нельзя задать что-то вроде: ">=7.0", если просто указать "7.0", с "8.0" будет ошибка при конфигурировании, типа "найдена версия 8, но требуется 7".
ep
CMake Error at CMakeLists.txt:92 (find_package): Could not find a configuration file for package "VTK" that is compatible with requested version "7". The following configuration files were considered but not accepted: C:/B/VTK/VTKConfig.cmake, version: 8.0.1 Как-то так.
Berkus
не указывай версию
Anatoly
find_package без версии
Anatoly
а уже потом как найдешь, ругайся
Anatoly
если она не в списке допустимых
Berkus
find_package(VTK REQUIRED) а потом проверяй версию, если надо
Anatoly
:)
ep
Разумно! Попробую, спасибо!
Square
#cpp #cxx #book #books #nopiracy #practical #design #architecture
Square
Square
Square
Matwey
А почему собственно нет?
Constantine
Вот только язык делает implicit срезку
Constantine
Если я написал утюг == сковородка мне нужно специально уточнять, что не нужно сравнить два кухонных прибора
Constantine
Угу, а теперь утюг и сковородка наследуют кухонный прибор, который можно сравнить
Constantine
Ну не знаю, в стандартной библиотеке 146 примеров, когда для не final класса определено ==
Constantine
Например, для std::vector, std::string
Constantine
Публично наследуют, а кухонные приборы сравниваются по наличию ручки
Constantine
Да, только теперь любые потомки std::vector можно сравнить как std::vector
Constantine
А что мне мешает это делать?
Constantine
Например, чтобы стандартные функции интегрировать, вроде сортировки с непараметрическим компаратором
Constantine
Я бы может быть и чаще его наследовал, но вот незадача, этот класс совершенно для этого не предназначен, в том числе потому что уже определил ==
Constantine
Вот я могу дать недавний пример. У меня есть два класса - один отвечает за адресацию узла в дереве, второй отвечает за адресацию отрезка потомков одной вершины в дереве
Constantine
Первый из них это std::vector<int> в чистом виде с определенным сложением, второй это первый плюс отрезок
Constantine
Ну вот вам пример. Я должен вектор композировать?
Matwey
Ну очевидно, что например квадрат - это частный случай прямоугольника, их можно между собой сравнивать.
Matwey
сравниваем верхний левый угол и нижний правый
Matwey
как обычно
Constantine
Адрес вершины в дереве это вектор из номеров вершин на пути от корня до нее. Как мне определить тип адреса вершины?
Matwey
если они совпадают, то неважно, квадраты мы сравниваем, или прямоугольник с квадратом
Matwey
А что с типом делать?
Matwey
Если я создам об\ект класса "прямоугольник" и запишу ему width такой же кк height, он почему-то средствами языка вдруг не станет объектом класса "квадрат"
Matwey
Вот беда
Constantine
Ну квадрат и прямоугольник плохо, надо квадрат и круг
Constantine
Которые подозрительно имеют общий тип "шары в метрике"
Adam
Всем привет
Constantine
Единственное отличие адреса вершины от std::vector в семантике сложения. { 1, 10, 100 } + {3, 30, 300} это {1, 10, 103, 30, 300}
ep
Вообще неудачный пример с геометрическими фигурами. Я даже где-то статью давно видел, что не надо так делать. Тут входят в противостояние геометрия и ООП
Constantine
Для окружностей и квадратов
Constantine
У типа три параметра - центр и радиус
Constantine
Но это все еще неудачный пример, поскольку я в явном виде могу отличить абстрактные и конкретные типы
Constantine
Илья, вон там мой лежит
Andrei
ООП не отражает отношения между объектами реального мира, вот так сюрприз! Не все объекты входят в отношение друг с другом совместимо с LSP.
Constantine
Путь в дереве это последовательность произвольной длины. Точко-векторная аналогия, весьма успешная в геометрии, говорит, что нужно не различать точки и смещения. Поэтому у пути в дереве определено сложение следующего вида: { 1, 10, 100 } + {3, 30, 300} это {1, 10, 103, 30, 300}. Как мне сделать тип пути в дереве?
Constantine
Что непонятно? Что такое дерево, что такое путь в дереве, что такое геометрия?)
Constantine
Я все еще хочу узнать, должен ли я наследовать std::vector, если единственное, что мне нужно - это определить одну операцию
Constantine
Я могу пофиксить все проблемы с наследованием и operator == в С++ одной конструкцией языка - ссылкой, которой запрещен полиморфизм
Constantine
Кстати, с присваиванием тоже
Constantine
Потому что проблемы возникают из-за того, что операция, заведомо не принимающая полиморфный тип, принимает ссылку, которая по природе своей полиморфная
Matwey
bool equal(const Rectangle& r1, const Rectrange& r2) { return r1.topLeft() == r2.topLeft() && r1.bottomRight() == r2.bottomRight(); } Квадрат - это наследник прямоугольника.