Здравствуйте, Erop, Вы писали:
E>Здравствуйте, johny5, Вы писали:
J>>Замечательно работало, правда использовал лишь единожды да и помоему позднее таки выкинул. J>>Если нужно, могу впостить код целиком.
E>UB на UB + виртуальная база всё нагнёт...
UB там нет, разве что используется "фича" MSVC собственно компилять шаблон в месте использования.
А виртуальная база.. наследование тут никак не касается смещений к полям в структуре, они фиксированы относительно владеющего пропертью класса.
Здравствуйте, johny5, Вы писали:
J>UB там нет, разве что используется "фича" MSVC собственно компилять шаблон в месте использования. J>А виртуальная база.. наследование тут никак не касается смещений к полям в структуре, они фиксированы относительно владеющего пропертью класса.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, johny5, Вы писали:
J>А виртуальная база.. наследование тут никак не касается смещений к полям в структуре, они фиксированы относительно владеющего пропертью класса.
Что даёт такие гарантии?
Я понимаю, что если уж надо выкручиваться, то приходится хаккать. Но это именно хакки, а не промышленное решение. Другое дело, если бы такой сервис можно было бы обеспечить на уовне языка, так же, как и указатели на члены, например.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, johny5, Вы писали:
J>>А виртуальная база.. наследование тут никак не касается смещений к полям в структуре, они фиксированы относительно владеющего пропертью класса.
E>Что даёт такие гарантии?
Эм, что поля в классе не скачут с места на место?
E>Я понимаю, что если уж надо выкручиваться, то приходится хаккать. Но это именно хакки, а не промышленное решение. Другое дело, если бы такой сервис можно было бы обеспечить на уовне языка, так же, как и указатели на члены, например.
Я бы не сказал что моя обёртка такие уж "хаки", нормальная типобезопасная имплементация, пусть кривоват синтаксис но если надо... Плюс, есть же __declspec( property .. пусть даже непортируемое.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, johny5, Вы писали:
J>>UB там нет, разве что используется "фича" MSVC собственно компилять шаблон в месте использования. J>>А виртуальная база.. наследование тут никак не касается смещений к полям в структуре, они фиксированы относительно владеющего пропертью класса.
E>
По стандарту, строго говоря, да, делать какую то арифметику с this нехорошо. Но это UB для абстрактного компилятора в вакууме. Практически это 100% стабильно работает к примеру MSVC (ибо целочисленная арифметика с указателями даёт желаемое). И я думаю заведётся под все остальные среды исполнения. Сейчас мне в голову даже не приходит что может помешать подобной арифметике работать неверно.
Здравствуйте, johny5, Вы писали:
E>>Что даёт такие гарантии? J>Эм, что поля в классе не скачут с места на место?
Что смещение от this не изменится ни в каком MDT...
J>Я бы не сказал что моя обёртка такие уж "хаки", нормальная типобезопасная имплементация, пусть кривоват синтаксис но если надо... Плюс, есть же __declspec( property .. пусть даже непортируемое.
Ну да. Беда только в том, что проперти в С++ вообще криво смотрятся. И вообще это всё в целом криво.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, johny5, Вы писали:
J>По стандарту, строго говоря, да, делать какую то арифметику с this нехорошо. Но это UB для абстрактного компилятора в вакууме. Практически это 100% стабильно работает к примеру MSVC (ибо целочисленная арифметика с указателями даёт желаемое). И я думаю заведётся под все остальные среды исполнения. Сейчас мне в голову даже не приходит что может помешать подобной арифметике работать неверно.
Строго говоря уже OFFSETOF -- MS-spec...
И в MSDN'е про него вроде писали, что тока к POD применять мона...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, johny5, Вы писали:
J>>По стандарту, строго говоря, да, делать какую то арифметику с this нехорошо. Но это UB для абстрактного компилятора в вакууме. Практически это 100% стабильно работает к примеру MSVC (ибо целочисленная арифметика с указателями даёт желаемое). И я думаю заведётся под все остальные среды исполнения. Сейчас мне в голову даже не приходит что может помешать подобной арифметике работать неверно.
E>Строго говоря уже OFFSETOF -- MS-spec... E>И в MSDN'е про него вроде писали, что тока к POD применять мона...
Здравствуйте, johny5, Вы писали:
J>>>UB там нет, разве что используется "фича" MSVC собственно компилять шаблон в месте использования. J>>>А виртуальная база.. наследование тут никак не касается смещений к полям в структуре, они фиксированы относительно владеющего пропертью класса. E>>
E>>Это, по твоему, не UB? J>По стандарту, строго говоря, да, делать какую то арифметику с this нехорошо.
можно попробовать не использовать вообще offsetof, а вычислять смещение в runtime, один раз для каждой пары (класс,его property), то есть хранить такие смещения в глобальном объекте.
насколько это UB?
1) В С++ большие и маленькие буквы ОТЛИЧАЮТСЯ!!!
2)
Because of the extended functionality of structs in C++, in this language, the use of offsetof is restricted to "POD types", which for classes, more or less corresponds to the C concept of struct (although non-derived classes with only public non-virtual member functions and with no constructor and/or destructor would also qualify as POD).
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Piko, Вы писали:
E>>>Строго говоря уже OFFSETOF -- MS-spec... E>>>И в MSDN'е про него вроде писали, что тока к POD применять мона...
P>>http://www.cplusplus.com/reference/clibrary/cstddef/offsetof/
E>1) В С++ большие и маленькие буквы ОТЛИЧАЮТСЯ!!!
НИ ЕДИНОГО РАЗРЫВА!
да, я знаю
E>2)
Because of the extended functionality of structs in C++, in this language, the use of offsetof is restricted to "POD types", which for classes, more or less corresponds to the C concept of struct (although non-derived classes with only public non-virtual member functions and with no constructor and/or destructor would also qualify as POD).
Здравствуйте, Piko, Вы писали:
P>да, я видел, и?
И
1) OFFSETOF таки MS-специфик
2) Оба макроса требуют, что бы объемлющий класс был POD...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Piko, Вы писали:
P>можно попробовать не использовать вообще offsetof, а вычислять смещение в runtime, один раз для каждой пары (класс,его property), то есть хранить такие смещения в глобальном объекте. P>насколько это UB?
Гарантий тоже не будет.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Piko, Вы писали:
P>>можно попробовать не использовать вообще offsetof, а вычислять смещение в runtime, один раз для каждой пары (класс,его property), то есть хранить такие смещения в глобальном объекте. P>>насколько это UB? E>Гарантий тоже не будет.
То есть разница между двумя this, в случае когда один класс агрегирует другой, может быть разной для разных инстансов агрегирующего класса?
Здравствуйте, Piko, Вы писали:
P>То есть разница между двумя this, в случае когда один класс агрегирует другой, может быть разной для разных инстансов агрегирующего класса?
Оно, вроде как, может быть даже невычислимо, или неопределено...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>То есть разница между двумя this, в случае когда один класс агрегирует другой, может быть разной для разных инстансов агрегирующего класса? E>Оно, вроде как, может быть даже невычислимо, или неопределено...
что не вычислимо?
нельзя кастануть указатели разных типов к void* и вычислить разницу между ними?
Здравствуйте, Piko, Вы писали:
P>нельзя кастануть указатели разных типов к void* и вычислить разницу между ними?
А разве есть гарантии, что объект всегда будет лежать в одном сегменте памяти?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>нельзя кастануть указатели разных типов к void* и вычислить разницу между ними? E>А разве есть гарантии, что объект всегда будет лежать в одном сегменте памяти?
Здравствуйте, Piko, Вы писали:
P>>>нельзя кастануть указатели разных типов к void* и вычислить разницу между ними? E>>А разве есть гарантии, что объект всегда будет лежать в одном сегменте памяти?
P>вы о чём вообще?
Вообще-то в С++ можно вычетать не любые два указателя, а только два указателя внутрь одногои того же сегмента памяти...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском