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[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[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[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[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: Два одинаковых типа
От: Кодт Россия  
Дата: 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[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[8]: Два одинаковых типа
От: kov_serg Россия  
Дата: 23.12.24 10:47
Оценка:
Здравствуйте, DenProg, Вы писали:

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

Не заморачивайся это опечатка должно было быть std::map. Я просто обычно его переименовываю в dict
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.