Re: Два одинаковых типа
От: Кодт Россия  
Дата: 23.12.24 10:30
Оценка: 1 (1) +1
Здравствуйте, DenProg, Вы писали:

DP>Привет. Есть два типа определенные одинаково:


Сейчас это один тип

DP>Возможно ли сделать так, чтобы такое не компилилось, или хотя бы компилилось с предупреждением?


Тут уже посоветовали наследоваться от вектора. Имхо, это плохая идея, так как она может в некоторых местах протечь (где-нибудь перепутать пользовательский тип и сырой вектор — в ту или другую сторону).

Я бы предложил не морочить себе голову, а просто завернуть в структуру.
Пусть даже с публичным полем, — чтобы минимально возиться с вопросами, что надо от вектора, а что не надо. Потом при случае отрефакторить, благо, все точки использования хорошо видны (поиском по имени поля либо кровавым рефакторингом — сделать приватным и смотреть, где компиляция сломалась).

using IntVec = std::vector<int>;

struct ElementId { IntVec data; };
struct LogicalId { IntVec data; };


Код становится громоздче на несколько символов, кажется, не жалко. Зато читаемость повышается.
void func(ElementId id) {
  ..... for (int i: id.data) .....
  ..... id.data[0] .....
  ..... std::size(id.data) .....
}

.... func(ElementId{.data = {1,2,3,4,5}} .....

Поля одноимённые или разноимённые в зависимости от того, есть ли какой-нибудь шаблонный код или хочется добавить паранойи.
Перекуём баги на фичи!
Re[6]: Два одинаковых типа
От: so5team https://stiffstream.com
Дата: 22.12.24 12:17
Оценка: +2
Здравствуйте, kov_serg, Вы писали:

S>>Это запросто могут быть координаты в многомерном пространстве.

_>Это уже не id а набор признаков

В проекте, которому сейчас помогаю, как раз объекты однозначно идентифицируются координатами в N-мерном пространстве. И это именно что полный аналог Id, а не набор признаков.

S>>И запросто может быть так, что количество измерений в этом пространстве определяется динамически и неизвестно на этапе компиляции, поэтому и std::vector, а не std::array.


_>Дело не в этом. Id предполагает хотя бы сравнение этих самых id


Если вы не в курсе, то для std::vector определены операторы сравнения: https://en.cppreference.com/w/cpp/container/vector (раздел Non-member functions).
Re: Два одинаковых типа
От: kov_serg Россия  
Дата: 20.12.24 17:40
Оценка: 3 (1)
Здравствуйте, DenProg, Вы писали:

DP>Возможно ли сделать так, чтобы такое не компилилось, или хотя бы компилилось с предупреждением?

typedef struct ElementId : std::vector<int> {};
typedef struct LogicalId : std::vector<int> {};
?
Re[2]: Два одинаковых типа
От: rg45 СССР  
Дата: 21.12.24 12:57
Оценка: 1 (1)
Здравствуйте, ·, Вы писали:

·>Не надо так делать. Лучше так:


Обоснование будет какое-нибудь?

·> // методы, имеющие смысл для id, а не вся простыня вектора


А почему ты уверен, что не вся простыня вектора имеет смысл для ID? Если человек выбрал вектор для задания собственных типов, то, возможно, ему и нужна вся "простыня"?
--
Справедливость выше закона. А человечность выше справедливости.
Re: Два одинаковых типа
От: wander  
Дата: 20.12.24 17:42
Оценка: +1
Здравствуйте, DenProg, Вы писали:

DP>Привет. Есть два типа определенные одинаково:

DP>
DP>typedef std::vector<int> ElementId;
DP>typedef std::vector<int> LogicalId;
DP>

.....
DP>Возможно ли сделать так, чтобы такое не компилилось, или хотя бы компилилось с предупреждением?

Ы?
https://www.boost.org/doc/libs/1_61_0/libs/serialization/doc/strong_typedef.html
Re: Два одинаковых типа
От: · Великобритания  
Дата: 21.12.24 12:38
Оценка: +1
Здравствуйте, DenProg, Вы писали:

DP> Привет. Есть два типа определенные одинаково:

DP>
DP> typedef std::vector<int> ElementId;
DP> typedef std::vector<int> LogicalId;
DP>

Не надо так делать. Лучше так:
class ElementId
{
private: 
   std::vector<int> value;
public:
   // методы, имеющие смысл для id, а не вся простыня вектора
}
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: Два одинаковых типа
От: kov_serg Россия  
Дата: 21.12.24 16:19
Оценка: :)
Здравствуйте, rg45, Вы писали:

R>Ну так, тебе ни что не мешает задать эти вопросы автору.


Не. думаю не стоит
Re[9]: Два одинаковых типа
От: rg45 СССР  
Дата: 22.12.24 17:55
Оценка: :)
Здравствуйте, kov_serg, Вы писали:

R>>Почему только число? А строка может быть?

_>Потому что из простых соображений на практике достаточно int32 или int64 для распределённых систем guid(int128)

И кроме того, подумалось. Ведь главный вопрос этой темы можно было бы без труда переформулировать и для чисел:

typedef int ElementId;
typedef int LogicalId;

void func(ElementId&); // <- ???


Так что, вопрос можно ли использовать вектор для задания ID, или нельзя — это вообще оффтоп в данном случае.
--
Справедливость выше закона. А человечность выше справедливости.
Re[10]: Два одинаковых типа
От: kov_serg Россия  
Дата: 23.12.24 10:40
Оценка: +1
Здравствуйте, rg45, Вы писали:

R>И кроме того, подумалось. Ведь главный вопрос этой темы можно было бы без труда переформулировать и для чисел:

R>
R>typedef int ElementId;
R>typedef int LogicalId;

R>void func(ElementId&); // <- ???
R>


R>Так что, вопрос можно ли использовать вектор для задания ID, или нельзя — это вообще оффтоп в данном случае.


Прикалываетесь?
typedef int ID;
struct ElementId { ID value; };
struct LogicalId { ID value; };
Re[26]: Два одинаковых типа
От: kov_serg Россия  
Дата: 23.12.24 13:29
Оценка: :)
Здравствуйте, rg45, Вы писали:

R>Вместо этого ты решил повыносить мозг мне


да
Re[7]: Два одинаковых типа
От: · Великобритания  
Дата: 23.12.24 21:06
Оценка: :)
Здравствуйте, rg45, Вы писали:

R>·>Можно. Внезапно для этого и придумали пользовательские типы, инкапсуляцию и т.п.

R>Внезапно, таким путём мы очень быстро придем к тому, что простые типы данных вообще нельзя использовать в чистом виде, а только через классы-обёртки.
А вы не приходите.

R>Да почему, собственно, только простые — любые! Хочешь использовать какой-то определенный пользователем класс, но не используешь все операции? Будь добр, напиши для него класс-обертку! Ты только так всегда делаешь?

Нет.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Два одинаковых типа
От: DenProg  
Дата: 20.12.24 17:35
Оценка:
Привет. Есть два типа определенные одинаково:
typedef std::vector<int> ElementId;
typedef std::vector<int> LogicalId;

Есть функция, принимающая один из них:
void func(ElementId& id)
{
}

Получается что такой вызов прокатывает без предупреждения:
LogicalId logical_id;
func(logical_id);

Возможно ли сделать так, чтобы такое не компилилось, или хотя бы компилилось с предупреждением?
Re[2]: Два одинаковых типа
От: rg45 СССР  
Дата: 21.12.24 11:45
Оценка:
Здравствуйте, kov_serg, Вы писали:

DP>>Возможно ли сделать так, чтобы такое не компилилось, или хотя бы компилилось с предупреждением?

_>
_>typedef struct ElementId : std::vector<int> {};
_>typedef struct LogicalId : std::vector<int> {};
_>
?


А чтобы эти можно было ещё и пользоваться, нелишним будет открыть доступ к конструкторам базового класса. И typedef здесь избыточен:

struct ElementId : std::vector<int> {using vector::vector;};
struct LogicalId : std::vector<int> {using vector::vector;};
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: Два одинаковых типа
От: kov_serg Россия  
Дата: 21.12.24 15:40
Оценка:
Здравствуйте, rg45, Вы писали:


R>А чтобы эти можно было ещё и пользоваться, нелишним будет открыть доступ к конструкторам базового класса. И typedef здесь избыточен:


R>
R>struct ElementId : std::vector<int> {using vector::vector;};
R>struct LogicalId : std::vector<int> {using vector::vector;};
R>


Да вы правы typedef избыточен, я просто скопировал из вопроса
Но в целом название ElementId и LogicalId с реализацие в виде вектора, например у меня вызывают некоторые вопросы.
Re[4]: Два одинаковых типа
От: rg45 СССР  
Дата: 21.12.24 15:42
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Но в целом название ElementId и LogicalId с реализацие в виде вектора, например у меня вызывают некоторые вопросы.


Ну так, тебе ни что не мешает задать эти вопросы автору.
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: Два одинаковых типа
От: · Великобритания  
Дата: 21.12.24 17:24
Оценка:
Здравствуйте, rg45, Вы писали:

r> ·>Не надо так делать. Лучше так:

r> Обоснование будет какое-нибудь?
Код проще читать и поддерживать.

r> ·> // методы, имеющие смысл для id, а не вся простыня вектора

r> А почему ты уверен, что не вся простыня вектора имеет смысл для ID?
Потому что ID это (is-a) не вектор.

r> Если человек выбрал вектор для задания собственных типов, то, возможно, ему и нужна вся "простыня"?

Интуитивно уверен, что невозможно в данном случае. Буду рад услышать обоснование нужности, желательно от автора.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Два одинаковых типа
От: rg45 СССР  
Дата: 21.12.24 17:29
Оценка:
Здравствуйте, ·, Вы писали:

r>> Обоснование будет какое-нибудь?

·>Код проще читать и поддерживать.

Ты про какой код? Любой, или конткретный?

r>> А почему ты уверен, что не вся простыня вектора имеет смысл для ID?

·>Потому что ID это (is-a) не вектор.

Откуда ты знаешь, что у него за ID? Он мог бы заменить оригинальные имена на безликие Foo и Bar. К чему бы ты тогда придрался?

·>Интуитивно уверен, что невозможно в данном случае. Буду рад услышать обоснование нужности, желательно от автора.


Обоснования делает тот, кто делает утверждения. Так заведено.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 21.12.2024 18:22 rg45 . Предыдущая версия .
Re[4]: Два одинаковых типа
От: rg45 СССР  
Дата: 21.12.24 17:52
Оценка:
Здравствуйте, ·, Вы писали:

r>> А почему ты уверен, что не вся простыня вектора имеет смысл для ID?

·>Потому что ID это (is-a) не вектор.

А если он напишет так:

class ElementId
{
private: 
   typedef std::vector<int> Value;
   Value value;
public:
   // методы, имеющие смысл для id, а не вся простыня вектора
};


У тебя тоже возникнут замечания?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 21.12.2024 18:10 rg45 . Предыдущая версия . Еще …
Отредактировано 21.12.2024 18:07 rg45 . Предыдущая версия .
Re[5]: Два одинаковых типа
От: · Великобритания  
Дата: 21.12.24 19:22
Оценка:
Здравствуйте, rg45, Вы писали:

r>>> Обоснование будет какое-нибудь?

R>·>Код проще читать и поддерживать.
R>Ты про какой код? Любой, или конткретный?
Конкретный, конечно. Любой код можно писать любым способом.

r>>> А почему ты уверен, что не вся простыня вектора имеет смысл для ID?

R>·>Потому что ID это (is-a) не вектор.
R>Откуда ты знаешь, что у него за ID? Он мог бы
Тогда бы это бы был бы другой вопрос бы. И я бы отвечал бы по-другому бы.

R>·>Интуитивно уверен, что невозможно в данном случае. Буду рад услышать обоснование нужности, желательно от автора.

R>Обоснования делает тот, кто делает утверждения.
Судя по именам, это какая то конкретная предметная область, а значит это бизнес сущности, публичный интерфейс которых задаётся бизнес-требованиями, а не Стандартной библиотекой.

R>Так заведено.

Ещё в форумах заведено рассказывать о решаемой задаче, а не спрашивать почему выбранное решение не работает.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: Два одинаковых типа
От: · Великобритания  
Дата: 21.12.24 19:23
Оценка:
Здравствуйте, rg45, Вы писали:

R>·>Потому что ID это (is-a) не вектор.

R>А если он напишет так:
R>...
R>У тебя тоже возникнут замечания?
Ок. А чем это принципиально отличается от моего?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: Два одинаковых типа
От: rg45 СССР  
Дата: 21.12.24 20:27
Оценка:
Здравствуйте, ·, Вы писали:

R>>У тебя тоже возникнут замечания?

·>Ок. А чем это принципиально отличается от моего?

Так это к тебе вопрос. Видишь ли ты здесь принципиальные отличия от своего варианта и есть ли у тебя какие-либо замечания?
--
Справедливость выше закона. А человечность выше справедливости.
Re[6]: Два одинаковых типа
От: rg45 СССР  
Дата: 21.12.24 20:42
Оценка:
Здравствуйте, ·, Вы писали:

R>>Ты про какой код? Любой, или конткретный?

·>Конкретный, конечно. Любой код можно писать любым способом.

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

R>>Откуда ты знаешь, что у него за ID? Он мог бы

·>Тогда бы это бы был бы другой вопрос бы. И я бы отвечал бы по-другому бы.
·>Судя по именам, это какая то конкретная предметная область, а значит это бизнес сущности, публичный интерфейс которых задаётся бизнес-требованиями, а не Стандартной библиотекой.

То есть, ты по одним только именам реконструировал полную семантику типов и требования к ним. Ну, круто. Все экстрасенсы мира завидуют.

R>>Так заведено.

·>Ещё в форумах заведено рассказывать о решаемой задаче, а не спрашивать почему выбранное решение не работает.

То есть, если какой-то новичок в форуме допускает какую-то погрешность, это сразу даёт тебе повод говорить что попало?
--
Справедливость выше закона. А человечность выше справедливости.
Re[7]: Два одинаковых типа
От: · Великобритания  
Дата: 21.12.24 23:18
Оценка:
Здравствуйте, rg45, Вы писали:

r> ·>Конкретный, конечно. Любой код можно писать любым способом.

r> Похоже, ты знаешь больше деталей. Ну, так расскажи тогда, почему именно в этом конкретном случае "так делать не надо".
Я рассказал выше.

r> То есть, ты по одним только именам реконструировал полную семантику типов и требования к ним. Ну, круто. Все экстрасенсы мира завидуют.

Не экстрасенс, а опыт. Буду рад ошибиться, чему-нибудь новому научусь.
Ещё раз. Читай внимательно. Наследование — это создание is-a отношения. Т.е. "хитровывернутый вектор" может наследовать вектор. А вот id вектором не является, по крайней мере в общепринятой терминологии. Если у него там какой-то особенный такой id, который ещё и вектор, то у него плохое именование сущностей.

r> То есть, если какой-то новичок в форуме допускает какую-то погрешность, это сразу даёт тебе повод говорить что попало?

Так я не говорил что попало.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: Два одинаковых типа
От: · Великобритания  
Дата: 21.12.24 23:18
Оценка:
Здравствуйте, rg45, Вы писали:

r> R>>У тебя тоже возникнут замечания?

r> ·>Ок. А чем это принципиально отличается от моего?
r> Так это к тебе вопрос. Видишь ли ты здесь принципиальные отличия от своего варианта и есть ли у тебя какие-либо замечания?
не вижу, замечаний нет.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[8]: Два одинаковых типа
От: rg45 СССР  
Дата: 22.12.24 00:28
Оценка:
Здравствуйте, ·, Вы писали:

·>не вижу, замечаний нет.


Ну так я же и интересуюсь, почему вот так "делать не надо":

typedef std::vector<int> ElementId;
typedef std::vector<int> LogicalId;


А вот так "замечаний нет":

typedef std::vector<int> Value;


Если "Value" может быть вектором, то почему "Id" не может быть вектором?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 22.12.2024 0:51 rg45 . Предыдущая версия . Еще …
Отредактировано 22.12.2024 0:43 rg45 . Предыдущая версия .
Re[8]: Два одинаковых типа
От: rg45 СССР  
Дата: 22.12.24 00:37
Оценка:
Здравствуйте, ·, Вы писали:

·>Я рассказал выше.


Выше я видел только домыслы и голословное постулирование

·>Не экстрасенс, а опыт. Буду рад ошибиться, чему-нибудь новому научусь.


Уникальный опыт, нужно заметить. Об этом опыте кто-нибудь ещё знает, кроме тебя?

·>Ещё раз. Читай внимательно.


Давай договоримся сразу: ты не говоришь мне, что делать, а я не говорю, куда тебе идти. Хорошо?

·>Наследование — это создание is-a отношения. Т.е. "хитровывернутый вектор" может наследовать вектор.


А где здесь
Автор: ·
Дата: 21.12 15:38
наследование? Ни в стартовом сообщении, ни в твоём, где "не надо так делать", никакого наследования не было. Вы с Shmj не из одной команды случайно?

·>А вот id вектором не является,


А это откуда следует? Просто потому что тебе так захотелось?

·>по крайней мере в общепринятой терминологии.


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

·>Если у него там какой-то особенный такой id, который ещё и вектор, то у него плохое именование сущностей.


О, "если"! Т.е. сначала даем "эксперные" оценки, а после этого начинаем строить предположения — если то, а если это. Ну, сразу видно — опыт

·>Так я не говорил что попало.


Хорошо, говорил, не обосновывая. Разница не велика, имхо.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 22.12.2024 0:56 rg45 . Предыдущая версия . Еще …
Отредактировано 22.12.2024 0:55 rg45 . Предыдущая версия .
Отредактировано 22.12.2024 0:53 rg45 . Предыдущая версия .
Re[4]: Два одинаковых типа
От: so5team https://stiffstream.com
Дата: 22.12.24 05:36
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Но в целом название ElementId и LogicalId с реализацие в виде вектора, например у меня вызывают некоторые вопросы.


Это запросто могут быть координаты в многомерном пространстве.
И запросто может быть так, что количество измерений в этом пространстве определяется динамически и неизвестно на этапе компиляции, поэтому и std::vector, а не std::array.
Re[5]: Два одинаковых типа
От: kov_serg Россия  
Дата: 22.12.24 08:14
Оценка:
Здравствуйте, so5team, Вы писали:

S>Это запросто могут быть координаты в многомерном пространстве.

Это уже не id а набор признаков

S>И запросто может быть так, что количество измерений в этом пространстве определяется динамически и неизвестно на этапе компиляции, поэтому и std::vector, а не std::array.


Дело не в этом. Id предполагает хотя бы сравнение этих самых id
Re[9]: Два одинаковых типа
От: · Великобритания  
Дата: 22.12.24 09:50
Оценка:
Здравствуйте, rg45, Вы писали:

r>
r> typedef std::vector<int> Value;
r>

r> Если "Value" может быть вектором, то почему "Id" не может быть вектором?
"private:" — важная деталь.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[10]: Два одинаковых типа
От: rg45 СССР  
Дата: 22.12.24 12:10
Оценка:
Здравствуйте, ·, Вы писали:

r>> Если "Value" может быть вектором, то почему "Id" не может быть вектором?

·>"private:" — важная деталь.

А как ты понял, что определения автора, указанные в стартовом сообщении, не находятся в секции private?
--
Справедливость выше закона. А человечность выше справедливости.
Re[5]: Два одинаковых типа
От: DenProg  
Дата: 22.12.24 13:32
Оценка:
Здравствуйте, so5team, Вы писали:

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


_>>Но в целом название ElementId и LogicalId с реализацие в виде вектора, например у меня вызывают некоторые вопросы.


S>Это запросто могут быть координаты в многомерном пространстве.

S>И запросто может быть так, что количество измерений в этом пространстве определяется динамически и неизвестно на этапе компиляции, поэтому и std::vector, а не std::array.

ElementId — это уникальный Id элемента иерархии.
LogicalId — тоже Id элемента той же иерархии, но без определенного слоя.
Re[2]: Два одинаковых типа
От: DenProg  
Дата: 22.12.24 13:34
Оценка:
Здравствуйте, ·, Вы писали:

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


DP>> Привет. Есть два типа определенные одинаково:

DP>>
DP>> typedef std::vector<int> ElementId;
DP>> typedef std::vector<int> LogicalId;
DP>>

·>Не надо так делать. Лучше так:
·>
·>class ElementId
·>{
·>private: 
·>   std::vector<int> value;
·>public:
·>   // методы, имеющие смысл для id, а не вся простыня вектора
·>}
·>


Нет, заводить на это отдельный класс и наследовать все методы вектора нет смысла, ибо они будут просто вызываться с теми же сигнатурами.
Re[7]: Два одинаковых типа
От: cserg  
Дата: 22.12.24 14:13
Оценка:
Здравствуйте, so5team, Вы писали:

S>В проекте, которому сейчас помогаю, как раз объекты однозначно идентифицируются координатами в N-мерном пространстве. И это именно что полный аналог Id, а не набор признаков.

Но у вас же, скорее всего, нет ситуации, когда в некотором N-мерном пространстве вместе существуют объекты с N-x и N+y размерностям?
Re[6]: Два одинаковых типа
От: kov_serg Россия  
Дата: 22.12.24 14:36
Оценка:
Здравствуйте, DenProg, Вы писали:

DP>ElementId — это уникальный Id элемента иерархии.

DP>LogicalId — тоже Id элемента той же иерархии, но без определенного слоя.

ID это число однозначно идентифицирующее что-либо.
А тут это путь к объекту в некоторой иерархии.

std::dict<ID,Path> absolute_paths;
std::dict<ID,Path> logical_paths;
std::dict<ID,Path> some_other_paths;
std::dict<ID,Metadata> some_metadata;
Re[7]: Два одинаковых типа
От: rg45 СССР  
Дата: 22.12.24 14:45
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>ID это число однозначно идентифицирующее что-либо.


Почему только число? А строка может быть?
--
Справедливость выше закона. А человечность выше справедливости.
Re[8]: Два одинаковых типа
От: kov_serg Россия  
Дата: 22.12.24 14:59
Оценка:
Здравствуйте, rg45, Вы писали:

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


_>>ID это число однозначно идентифицирующее что-либо.


R>Почему только число? А строка может быть?

Потому что из простых соображений на практике достаточно int32 или int64 для распределённых систем guid(int128)
Re[9]: Два одинаковых типа
От: rg45 СССР  
Дата: 22.12.24 15:02
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Потому что из простых соображений на практике достаточно int32 или int64 для распределённых систем guid(int128)


Ну, как шутка проканает
--
Справедливость выше закона. А человечность выше справедливости.
Re[8]: Два одинаковых типа
От: so5team https://stiffstream.com
Дата: 22.12.24 15:24
Оценка:
Здравствуйте, cserg, Вы писали:

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


S>>В проекте, которому сейчас помогаю, как раз объекты однозначно идентифицируются координатами в N-мерном пространстве. И это именно что полный аналог Id, а не набор признаков.

C>Но у вас же, скорее всего, нет ситуации, когда в некотором N-мерном пространстве вместе существуют объекты с N-x и N+y размерностям?

А при чем здесь это? Посыл же был в том, что вектор целых вряд ли может служить в качестве ID. Я привел пример ситуации, когда может.

Касательно предметной области из которой был взят пример, то да, в рамках одного и того же N-мерного пространства не может быть объектов, координаты которых содержат (N-x) или (N+y) значений. Но в самом приложении одновременно существует несколько пространств разных размерностей.
Re[7]: Два одинаковых типа
От: DenProg  
Дата: 22.12.24 19:44
Оценка:
Здравствуйте, kov_serg, Вы писали:

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


DP>>ElementId — это уникальный Id элемента иерархии.

DP>>LogicalId — тоже Id элемента той же иерархии, но без определенного слоя.

_>ID это число однозначно идентифицирующее что-либо.

_>А тут это путь к объекту в некоторой иерархии.

_>std::dict<ID,Path> absolute_paths;

_>std::dict<ID,Path> logical_paths;
_>std::dict<ID,Path> some_other_paths;
_>std::dict<ID,Metadata> some_metadata;

Проблема в названии? У меня это вектор. Слава богу язык этого не запрещает. Про std::dict наверно раньше не слышал.
Re[4]: Два одинаковых типа
От: DenProg  
Дата: 22.12.24 19:47
Оценка:
Здравствуйте, ·, Вы писали:

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


r>> ·>Не надо так делать. Лучше так:

r>> Обоснование будет какое-нибудь?
·>Код проще читать и поддерживать.

r>> ·> // методы, имеющие смысл для id, а не вся простыня вектора

r>> А почему ты уверен, что не вся простыня вектора имеет смысл для ID?
·>Потому что ID это (is-a) не вектор.

r>> Если человек выбрал вектор для задания собственных типов, то, возможно, ему и нужна вся "простыня"?

·>Интуитивно уверен, что невозможно в данном случае. Буду рад услышать обоснование нужности, желательно от автора.

Нужны все основные методы вектора. И переопределять их в новом классе смысла нет.
Re[5]: Два одинаковых типа
От: sergii.p  
Дата: 23.12.24 10:18
Оценка:
Здравствуйте, DenProg, Вы писали:

DP>Нужны все основные методы вектора. И переопределять их в новом классе смысла нет.


тогда так

struct ElementId: std::vector<int> {};
Re[8]: Два одинаковых типа
От: kov_serg Россия  
Дата: 23.12.24 10:47
Оценка:
Здравствуйте, DenProg, Вы писали:

DP>Проблема в названии? У меня это вектор. Слава богу язык этого не запрещает. Про std::dict наверно раньше не слышал.

Не заморачивайся это опечатка должно было быть std::map. Я просто обычно его переименовываю в dict
Re[2]: Два одинаковых типа
От: rg45 СССР  
Дата: 23.12.24 10:50
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Я бы предложил не морочить себе голову, а просто завернуть в структуру.

К>Пусть даже с публичным полем, — чтобы минимально возиться с вопросами, что надо от вектора, а что не надо. Потом при случае отрефакторить, благо, все точки использования хорошо видны (поиском по имени поля либо кровавым рефакторингом — сделать приватным и смотреть, где компиляция сломалась).

К>
К>using IntVec = std::vector<int>;

К>struct ElementId { IntVec data; };
К>struct LogicalId { IntVec data; };
К>


Практически это то же самое, что и в подходе с BOOST_STRONG_TYPEDEF, только без привлечения boost.
--
Справедливость выше закона. А человечность выше справедливости.
Re[11]: Два одинаковых типа
От: rg45 СССР  
Дата: 23.12.24 10:53
Оценка:
Здравствуйте, kov_serg, Вы писали:

R>>Так что, вопрос можно ли использовать вектор для задания ID, или нельзя — это вообще оффтоп в данном случае.


_>Прикалываетесь?


Даже не думал.

_>
_>typedef int ID;
_>struct ElementId { ID value; };
_>struct LogicalId { ID value; };
_>


Не понял, что ты хочешь этим сказать. Разверни свою мысль словами, если не трудно.
--
Справедливость выше закона. А человечность выше справедливости.
Re[12]: Два одинаковых типа
От: kov_serg Россия  
Дата: 23.12.24 10:58
Оценка:
Здравствуйте, rg45, Вы писали:

R>Не понял, что ты хочешь этим сказать. Разверни свою мысль словами, если не трудно.


Мысть простоя: на практике идентификатора в виде числа фиксированной длинны более чем достаточно.
Re[13]: Два одинаковых типа
От: rg45 СССР  
Дата: 23.12.24 11:00
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Мысть простоя: на практике идентификатора в виде числа фиксированной длинны более чем достаточно.


А как это противоречит тому, что написал я
Автор: rg45
Дата: 22.12 20:55
?

Даже не так. Как это, вообще, связано с тем, что написал я? Какое именно МОЁ высказывание вызывает у тебя несогласие?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 23.12.2024 11:14 rg45 . Предыдущая версия . Еще …
Отредактировано 23.12.2024 11:02 rg45 . Предыдущая версия .
Отредактировано 23.12.2024 11:01 rg45 . Предыдущая версия .
Re[14]: Два одинаковых типа
От: kov_serg Россия  
Дата: 23.12.24 11:37
Оценка:
Здравствуйте, rg45, Вы писали:

R>А как это противоречит тому, что написал я
Автор: rg45
Дата: 22.12 20:55
?

typedef int ElementId;
typedef int LogicalId;

void func(ElementId&);
void func(LogicalId&); // <- ???


R>Даже не так. Как это, вообще, связано с тем, что написал я? Какое именно МОЁ высказывание вызывает у тебя несогласие?


"Не понял, что ты хочешь этим сказать. Разверни свою мысль словами, если не трудно."
Re[15]: Два одинаковых типа
От: rg45 СССР  
Дата: 23.12.24 11:45
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>"Не понял, что ты хочешь этим сказать. Разверни свою мысль словами, если не трудно."


Вот это сообщение
Автор: kov_serg
Дата: 23.12 13:40
я воспринял как несогласие. Только не понял, как какому именно из двух высказываний это несогласие относится:


Пояснишь?
--
Справедливость выше закона. А человечность выше справедливости.
Re[16]: Два одинаковых типа
От: kov_serg Россия  
Дата: 23.12.24 11:56
Оценка:
Здравствуйте, rg45, Вы писали:

R>Вот это сообщение
Автор: kov_serg
Дата: 23.12 13:40
я воспринял как несогласие. Только не понял, как какому именно из двух высказываний это несогласие относится:


R> Главный вопрос этой темы можно было бы переформулировать для чисел;

можно
R> Вопрос, можно ли использовать вектор для задания ID, является оффтопом для данной темы.
я просто высказал сомнения что вектор это не самый удачный выбор для типа идентификатора

R>Пояснишь?

Вы просто не в том контексте смотрите. Поэтому и возникли такие разночтения.

> ElementId — это уникальный Id элемента иерархии.

> LogicalId — тоже Id элемента той же иерархии, но без определенного слоя.

ElementId — это путь к элементу
LogicalId — это локальный путь, отностиельно некоторого узла.

То есть это дерево (аналог файловая система)

[ElementId]
root-->a-->b-->c-->element_1
root-->a-->b-->element_2
root-->d-->a-->element_3
root-->e-->a-->element_4

[LogicalId]
a-->element_3

И в качестве идентификаторов логично использовать числа 1,2,3,4

То есть назвать это не Id а Path:
ElementPath
LogicalPath
Re[17]: Два одинаковых типа
От: rg45 СССР  
Дата: 23.12.24 12:10
Оценка:
Здравствуйте, kov_serg, Вы писали:

R>>Пояснишь?

_>Вы просто не в том контексте смотрите. Поэтому и возникли такие разночтения.
_> . . .

Разночтения возникли из-за того, что ты неожиданно перескочил к тому, что мы обсуждали выше. Я считал, что тот вопрос мы уже закрыли, но если хочешь, можем продолжить обсуждение.

_>я просто высказал сомнения что вектор это не самый удачный выбор для типа идентификатора


Остановились мы вот на чём:

http://rsdn.org/forum/cpp/8871506.1
Автор: rg45
Дата: 22.12 17:45


_> ID это число однозначно идентифицирующее что-либо.
R> Почему только число? А строка может быть?


Вот с этого места давай и продолжим. Твой ход.

Там после этого с твоей стороны была ещё одна фраза, но я её воспринял как шутку, беря во внимание смайлик в конце утверждения.
--
Справедливость выше закона. А человечность выше справедливости.
Re[18]: Два одинаковых типа
От: kov_serg Россия  
Дата: 23.12.24 12:17
Оценка:
Здравствуйте, rg45, Вы писали:

R>Остановились мы вот на чём:


R>http://rsdn.org/forum/cpp/8871506.1
Автор: rg45
Дата: 22.12 17:45


R>

_>> ID это число однозначно идентифицирующее что-либо.
R>> Почему только число? А строка может быть?


R>Вот с этого места давай и продолжим. Твой ход.

Я смотрю вы заядлый шахматист.
Да строка может быть. Но желательно фиксированной длинны. Например "1PRTTaJesdNovgne6Ehcdu1fpEdX7913CK"

R>Там после этого с твоей стороны была ещё одна фраза, но я её воспринял как шутку, беря во внимание смайлик в конце утверждения.

я думала это трюфель

Re[19]: Два одинаковых типа
От: rg45 СССР  
Дата: 23.12.24 12:20
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Да строка может быть. Но желательно фиксированной длинны. Например "1PRTTaJesdNovgne6Ehcdu1fpEdX7913CK"


Было бы здорово, если бы ты обосновывал свои утверждения а не просто постулировал. Для кого желательно, почему желательно, насколько желательно и т.п. В противном случае ты сам лишаешь меня возможности принять твою точку зрения.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 23.12.2024 12:49 rg45 . Предыдущая версия . Еще …
Отредактировано 23.12.2024 12:43 rg45 . Предыдущая версия .
Отредактировано 23.12.2024 12:28 rg45 . Предыдущая версия .
Re[20]: Два одинаковых типа
От: kov_serg Россия  
Дата: 23.12.24 12:48
Оценка:
Здравствуйте, rg45, Вы писали:

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

Для быстродействия желательно фиксированный размер данных равный размеру регистра процессора или хотябы не сильно избыточный (не превосходящий L1 кэш)
Данные фиксированной длинны лучше размещаются в памяти и их проще кэшировать, читать, писать, сравнивать, чем данные непредсказуемой длинны. Для которых обычно используют hash функции, что бы уменьшить кол-во обращений непосредственно к телу. Вобщем сплошные дополнительные накладные расходы из ничего.

ps: промежуточные представления в виде строки, тоже никто не запрещает
Re[21]: Два одинаковых типа
От: rg45 СССР  
Дата: 23.12.24 13:00
Оценка:
Здравствуйте, kov_serg, Вы писали:

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

_>Для быстродействия желательно фиксированный размер данных равный размеру регистра процессора или хотябы не сильно избыточный (не превосходящий L1 кэш)
_>Данные фиксированной длинны лучше размещаются в памяти и их проще кэшировать, читать, писать, сравнивать, чем данные непредсказуемой длинны. Для которых обычно используют hash функции, что бы уменьшить кол-во обращений непосредственно к телу. Вобщем сплошные дополнительные накладные расходы из ничего.

_>ps: промежуточные представления в виде строки, тоже никто не запрещает



А, то есть, желательно с точки зрения быстродействия. Ну, ОК. То есть, в тех местах, где быстродействие не критично, допустимо применять также и строки переменной длины, согласен?

Итого, в качестве идентификаторов можно использовать: числа, перечисления и классы. Таким образом, если вернуться к началу дискусси
Автор: kov_serg
Дата: 22.12 17:36
, то ID — это что угодно, однозначно идентифицирующее что-либо.

Хорошо. И как мы приходим к заключению, что тип std::vector<int> не может или не должен использоваться в качестве ID?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 23.12.2024 13:03 rg45 . Предыдущая версия . Еще …
Отредактировано 23.12.2024 13:03 rg45 . Предыдущая версия .
Re[22]: Два одинаковых типа
От: kov_serg Россия  
Дата: 23.12.24 13:11
Оценка:
Здравствуйте, rg45, Вы писали:

R>Хорошо. И как мы приходим к заключению, что тип std::vector<int> не может или не должен использоваться в качестве ID.

Я нигде не писал что он не может быть использован. Я писал что возникают вопросы.
Типа:
— а не избыточенли такой тип в качестве идентификатора
— если это путь к объкету в некотором дереве то и называть его логичнее не идентификатором а "положением" location или "путём" path
— если это набор характеристик, то allele, bag of properties или вектором признаков
Re[23]: Два одинаковых типа
От: rg45 СССР  
Дата: 23.12.24 13:14
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Я нигде не писал что он не может быть использован. Я писал что возникают вопросы.


Ну, как обычно: на третий день дискуссии настал момент уточнить предмет спора

_>Типа:

_>- а не избыточенли такой тип в качестве идентификатора

Всё может быть. Это вопрос к автору.

_>- если это путь к объкету в некотором дереве то и называть его логичнее не идентификатором а "положением" location или "путём" path

_>- если это набор характеристик, то allele, bag of properties или вектором признаков

Всё может быть. Чего ты до сих пор не задал эти вопросы автору?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 23.12.2024 13:15 rg45 . Предыдущая версия .
Re[24]: Два одинаковых типа
От: kov_serg Россия  
Дата: 23.12.24 13:21
Оценка:
Здравствуйте, rg45, Вы писали:

R>Всё может быть. Чего ты до сих пор не задал эти вопросы автору?

Не видел в этом смысла.
Re[25]: Два одинаковых типа
От: rg45 СССР  
Дата: 23.12.24 13:22
Оценка:
Здравствуйте, kov_serg, Вы писали:

R>>Всё может быть. Чего ты до сих пор не задал эти вопросы автору?

_>Не видел в этом смысла.

Вместо этого ты решил повыносить мозг мне
--
Справедливость выше закона. А человечность выше справедливости.
Re[17]: Два одинаковых типа
От: DenProg  
Дата: 23.12.24 16:22
Оценка:
Здравствуйте, kov_serg, Вы писали:

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


R>>Вот это сообщение
Автор: kov_serg
Дата: 23.12 13:40
я воспринял как несогласие. Только не понял, как какому именно из двух высказываний это несогласие относится:


R>> Главный вопрос этой темы можно было бы переформулировать для чисел;

_>можно
R>> Вопрос, можно ли использовать вектор для задания ID, является оффтопом для данной темы.
_>я просто высказал сомнения что вектор это не самый удачный выбор для типа идентификатора

R>>Пояснишь?

_>Вы просто не в том контексте смотрите. Поэтому и возникли такие разночтения.

>> ElementId — это уникальный Id элемента иерархии.

>> LogicalId — тоже Id элемента той же иерархии, но без определенного слоя.

_>ElementId — это путь к элементу

_>LogicalId — это локальный путь, отностиельно некоторого узла.

_>То есть это дерево (аналог файловая система)


_>[ElementId]

_>root-->a-->b-->c-->element_1
_>root-->a-->b-->element_2
_>root-->d-->a-->element_3
_>root-->e-->a-->element_4

_>[LogicalId]

a-->>element_3

_>И в качестве идентификаторов логично использовать числа 1,2,3,4


_>То есть назвать это не Id а Path:

_>ElementPath
_>LogicalPath

Путь в данном случае — это способ реализации идентификатора. Id реализовано на основе path.
Re[8]: Два одинаковых типа
От: · Великобритания  
Дата: 23.12.24 17:56
Оценка:
Здравствуйте, DenProg, Вы писали:

DP> DP>>ElementId — это уникальный Id элемента иерархии.

DP> DP>>LogicalId — тоже Id элемента той же иерархии, но без определенного слоя.
DP> Проблема в названии?
Да, название странное. Это Path, Position, Coords, Address, Location, и т.п. Неясно причём тут ID. Чем является элемент в векторе тогда?
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Два одинаковых типа
От: · Великобритания  
Дата: 23.12.24 17:56
Оценка:
Здравствуйте, DenProg, Вы писали:

DP> Нет, заводить на это отдельный класс и наследовать все методы вектора нет смысла, ибо они будут просто вызываться с теми же сигнатурами.

Точно все? и erase, и emplace, etc? А сравнение LogicalId и ElementId?
В любом случае, это недостаточное условие для применения наследования. Наследование подразумевает, что оно будет прозрачно приводиться к базовому типу и всё что работает с вектором должно работать так же как и с твоим классом.
https://en.wikipedia.org/wiki/Composition_over_inheritance
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Два одинаковых типа
От: rg45 СССР  
Дата: 23.12.24 20:00
Оценка:
Здравствуйте, ·, Вы писали:

·>Точно все? и erase, и emplace, etc? А сравнение LogicalId и ElementId?


Ну, с тем же успехом можно доколупаться и до простого целочисленного ID: "А вы точно собираетесь использовать, инкремент, унарный минус, исключающее или и др?".
--
Справедливость выше закона. А человечность выше справедливости.
Re[5]: Два одинаковых типа
От: · Великобритания  
Дата: 23.12.24 20:18
Оценка:
Здравствуйте, rg45, Вы писали:

R>·>Точно все? и erase, и emplace, etc? А сравнение LogicalId и ElementId?

R>Ну, с тем же успехом можно доколупаться и до простого целочисленного ID: "А вы точно собираетесь использовать, инкремент, унарный минус, исключающее или и др?".
Можно. Внезапно для этого и придумали пользовательские типы, инкапсуляцию и т.п.
Сабж же, как раз и спрашивают как типы сделать различными.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: Два одинаковых типа
От: rg45 СССР  
Дата: 23.12.24 20:21
Оценка:
Здравствуйте, ·, Вы писали:

·>Можно. Внезапно для этого и придумали пользовательские типы, инкапсуляцию и т.п.


Внезапно, таким путём мы очень быстро придем к тому, что простые типы данных вообще нельзя использовать в чистом виде, а только через классы-обёртки.

Да почему, собственно, только простые — любые! Хочешь использовать какой-то определенный пользователем класс, но не используешь все операции? Будь добр, напиши для него класс-обертку! Ты только так всегда делаешь?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 23.12.2024 20:26 rg45 . Предыдущая версия . Еще …
Отредактировано 23.12.2024 20:25 rg45 . Предыдущая версия .
Отредактировано 23.12.2024 20:23 rg45 . Предыдущая версия .
Re[4]: Два одинаковых типа
От: DenProg  
Дата: 24.12.24 08:02
Оценка:
Здравствуйте, ·, Вы писали:

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


DP>> Нет, заводить на это отдельный класс и наследовать все методы вектора нет смысла, ибо они будут просто вызываться с теми же сигнатурами.

·>Точно все? и erase, и emplace, etc? А сравнение LogicalId и ElementId?

Да, все. Для индентификации элемента и перемещения по иерархии больше ничего не надо. Сравнения LogicalId и ElementId не существует, тут долго объяснять, не буду.

·>В любом случае, это недостаточное условие для применения наследования. Наследование подразумевает, что оно будет прозрачно приводиться к базовому типу и всё что работает с вектором должно работать так же как и с твоим классом.

·>https://en.wikipedia.org/wiki/Composition_over_inheritance

Ну так оно и сейчас прозрачно приводится и работает, без перегрузки методов, нет?
Re[6]: Два одинаковых типа
От: DenProg  
Дата: 24.12.24 08:06
Оценка:
Здравствуйте, ·, Вы писали:

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


R>>·>Точно все? и erase, и emplace, etc? А сравнение LogicalId и ElementId?

R>>Ну, с тем же успехом можно доколупаться и до простого целочисленного ID: "А вы точно собираетесь использовать, инкремент, унарный минус, исключающее или и др?".
·>Можно. Внезапно для этого и придумали пользовательские типы, инкапсуляцию и т.п.
·>Сабж же, как раз и спрашивают как типы сделать различными.

Я как раз и использую C++ для скорости и меньшего объема ресурсов, здесь же предлагается перейти подобию джаваскрипта или ему подобного, причем там, где это не нужно. Типы уже сделали различными во втором посте.
Re[10]: Два одинаковых типа
От: sergii.p  
Дата: 24.12.24 08:36
Оценка:
Здравствуйте, rg45, Вы писали:

R>И кроме того, подумалось. Ведь главный вопрос этой темы можно было бы без труда переформулировать и для чисел:

R>Так что, вопрос можно ли использовать вектор для задания ID, или нельзя — это вообще оффтоп в данном случае.

не совсем. Для целочисленных зачастую лучше enum class.
Re[5]: Два одинаковых типа
От: · Великобритания  
Дата: 24.12.24 11:02
Оценка:
Здравствуйте, DenProg, Вы писали:

DP> ·>Точно все? и erase, и emplace, etc? А сравнение LogicalId и ElementId?

DP> Да, все. Для индентификации элемента и перемещения по иерархии больше ничего не надо. Сравнения LogicalId и ElementId не существует, тут долго объяснять, не буду.
Если использовать наследование, например как "struct Id : std::vector<int> {}", то сравниваться будут, а не должны.

DP> ·>https://en.wikipedia.org/wiki/Composition_over_inheritance

DP> Ну так оно и сейчас прозрачно приводится и работает, без перегрузки методов, нет?
Так не должно же.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: Два одинаковых типа
От: · Великобритания  
Дата: 24.12.24 11:04
Оценка:
Здравствуйте, DenProg, Вы писали:

DP>·>Сабж же, как раз и спрашивают как типы сделать различными.

DP>Я как раз и использую C++ для скорости и меньшего объема ресурсов, здесь же предлагается перейти подобию джаваскрипта или ему подобного, причем там, где это не нужно. Типы уже сделали различными во втором посте.
Не понял. Какие варианты из тут предложенных отличаются по скорости или ресурсам?! Ты, видимо, полагаешь, что C++ подобно джаваскрипту каждую строчку выполняет?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[8]: Два одинаковых типа
От: DenProg  
Дата: 24.12.24 11:54
Оценка:
Здравствуйте, ·, Вы писали:

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


DP>>·>Сабж же, как раз и спрашивают как типы сделать различными.

DP>>Я как раз и использую C++ для скорости и меньшего объема ресурсов, здесь же предлагается перейти подобию джаваскрипта или ему подобного, причем там, где это не нужно. Типы уже сделали различными во втором посте.
·> Не понял. Какие варианты из тут предложенных отличаются по скорости или ресурсам?! Ты, видимо, полагаешь, что C++ подобно джаваскрипту каждую строчку выполняет?

"Не множте сущности без необходимости". Не надо обертывать-переобертывать там, где этого не надо.
Re[6]: Два одинаковых типа
От: DenProg  
Дата: 24.12.24 11:59
Оценка:
Здравствуйте, ·, Вы писали:

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


DP>> ·>Точно все? и erase, и emplace, etc? А сравнение LogicalId и ElementId?

DP>> Да, все. Для индентификации элемента и перемещения по иерархии больше ничего не надо. Сравнения LogicalId и ElementId не существует, тут долго объяснять, не буду.
·>Если использовать наследование, например как "struct Id : std::vector<int> {}", то сравниваться будут, а не должны.

DP>> ·>https://en.wikipedia.org/wiki/Composition_over_inheritance

DP>> Ну так оно и сейчас прозрачно приводится и работает, без перегрузки методов, нет?
·>Так не должно же.
Честно говоря лень читать эту простыню на википедии. Не силен я в академических знаниях. Но зная проект думаю что проблем в этой части не возникнет.
Re[6]: Два одинаковых типа
От: rg45 СССР  
Дата: 24.12.24 12:39
Оценка:
Здравствуйте, ·, Вы писали:

·>Если использовать наследование, например как "struct Id : std::vector<int> {}", то сравниваться будут, а не должны.


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

Мне и самому вариант решения с наследованием не очень нравится. Я вообще не люблю наследование, стараюсь его избегать. Но даже в этом варианте решения возможно достичь приемлемой типовой безопасности, накидав в тело класса несколько дополнительных определений. А чтоб не делать это для каждого типа в отдельности, можно использовать шаблон:

http://coliru.stacked-crooked.com/a/0e65b861f54e6293

#include <iostream>
#include <vector>

template <typename Category>
struct MultiDimensionalId : std::vector<int> 
{
    using vector::vector; // Открываем все конструкоры vector для использования в этом классе
    bool operator == (const MultiDimensionalId&) const = default;
    auto operator <=> (const MultiDimensionalId&) const = default;
    bool operator == (const auto&) const = delete;
    auto operator <=> (const auto&) const = delete;
};

using ElementId = MultiDimensionalId<class ElementCategory>;
using LogicalId = MultiDimensionalId<class LogicalCategory>;

int main()
{
    std::cout << (ElementId{1, 2, 3} == ElementId{1, 2, 3}) << std::endl;
    std::cout << (ElementId{1, 20, 3} >= ElementId{1, 2, 3}) << std::endl;
    std::cout << (ElementId{1, 2, 3} < ElementId{1, 20, 3}) << std::endl;
    // std::cout << (ElementId{1, 2, 3} == LogicalId{1, 2, 3}) << std::endl; // error: use of deleted function
    //std::cout << (ElementId{1, 2, 3} >= LogicalId{1, 2, 3}) << std::endl; // error: use of deleted function
}


Повторюсь, я не считаю это лучшим решением, и не говорю, что делать нужно только так. Как по мне, идиома строгих типов, в том или ином варианте исполнения, здесь была бы в самый раз.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 24.12.2024 20:02 rg45 . Предыдущая версия . Еще …
Отредактировано 24.12.2024 13:43 rg45 . Предыдущая версия .
Отредактировано 24.12.2024 12:50 rg45 . Предыдущая версия .
Отредактировано 24.12.2024 12:44 rg45 . Предыдущая версия .
Re[6]: Два одинаковых типа
От: rg45 СССР  
Дата: 24.12.24 14:23
Оценка:
Здравствуйте, ·, Вы писали:

·>Сабж же, как раз и спрашивают как типы сделать различными.


Так вот именно. И для того, чтобы сделать типы различными, совсем не обязательно урезать список доступных операций. И получившиеся различные типы вполне могут быть подтипами одного типа без нарушения принципа подстановки Лисков. Это полностью отдельная задача.

Я не говорю, что твое решение плохое. Просто аргументация у тебя ни в дугу. А поначалу и вовсе никакой аргументации не было. Вроде царский указ зачитал.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 24.12.2024 19:53 rg45 . Предыдущая версия . Еще …
Отредактировано 24.12.2024 16:22 rg45 . Предыдущая версия .
Отредактировано 24.12.2024 15:45 rg45 . Предыдущая версия .
Отредактировано 24.12.2024 14:29 rg45 . Предыдущая версия .
Отредактировано 24.12.2024 14:23 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.