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
И разбираться с проблемами
Evgenii
но ведь импортировать и инклюдить одновременно смысла нет?
Constantine
Anatoly
🐙 Antony
ну только подменяя заголовочный файл на файл импортирующий модуль (как в псевдокоде выше)
Constantine
Constantine
Интересно, а импорт модуля можно же include-нуть?
🐙 Antony
Constantine
Да :)
Ну вот, std я уже подключил во всех файлы как модуль)
Constantine
А в какой точке происходит запись инстанцированных шаблонов?
Constantine
Она привязывается к импортирующему модулю?
Evgenii
ох
Constantine
Или все-таки к экспортирующему?
🐙 Antony
Это детали реализации.... тут уж кто во что горазд и у кого получится лучше. У MSVC есть единое место для хранения инстансов, у GCC нет
Constantine
Constantine
А что происходит с inline-функциями/переменными? Их экспортирует модуль?
Constantine
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
Constantine
Единственное отличие адреса вершины от std::vector в семантике сложения. { 1, 10, 100 } + {3, 30, 300} это {1, 10, 103, 30, 300}
ep
Вообще неудачный пример с геометрическими фигурами. Я даже где-то статью давно видел, что не надо так делать. Тут входят в противостояние геометрия и ООП
Constantine
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();
}
Квадрат - это наследник прямоугольника.