oktonion
Постоялец
Offline
|
|
« : 22-06-2019 11:33 » |
|
C++ standard (§9.5.1)A union can have member functions (including constructors and destructors), but not virtual functions. A union shall not have base classes. A union shall not be used as a base class. An object of a class with a non-trivial constructor, a non-trivial copy-constructor, a non-trivial destructor, or a non-trivial copy assignment operator cannot be a member of a union, nor can an array of such objects. If a union contains a static data member, or a member of a reference type, the program is ill-formed. Какие еще отличия есть у union от class/ struct в C++98/C++03?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 23-06-2019 16:42 » |
|
oktonion, а какие нужно ?
и вообще, union - это костыль, который нужен очень очень редко, обычно для работы с не очень хорошо спроектированной железякой. И совать туда какие-то хитрости вообще не советую.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #2 : 23-06-2019 18:07 » |
|
Не обязательно — железякой. Просто переиспользование памяти разными типами. Другой вопрос, что "нетривиальные" типы не поддерживаются. Редко бывает, но нужно. Хороший пример — различные реализации std::string, использующие память структуры для хранения коротких строк, а для сдлинных строк таже память используется для указателя и сопутствующих данных.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
oktonion
Постоялец
Offline
|
|
« Ответ #3 : 23-06-2019 22:10 » |
|
Алексей++, хороший вопрос. На самом деле любые. Поясню - хочу определять переданный шаблонный параметр union или class на этапе компиляции. В C++11 для этого ввели std::is_union и std::is_class соответственно, в 98/03 стандарте этого конечно нет. Все мои попытки на основе выдержки из стандарта отличить данные два понятия потерпели неудачу. union и class на столько похожи что у меня руки опускаются. Вот решил призвать коллективный мозг - возможно есть еще какое-то хитрое отличие, на основе которого я смогу вывести к чему относится тип.
Boost не предлагать. Там все тоже печально на эту тему.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #4 : 23-06-2019 23:30 » |
|
Следующий вопрос: а зачем? Что будем меняться для union и class?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 24-06-2019 07:37 » |
|
RXL, ну я под железякой как раз и имею в виду всякие трюки и их наследие (как и в CDBVariant тоже)
oktonion, в новые стандарты ввели флаги, чтобы было проще разбираться в старом коде. Но всё же лучше избегать union, на мой взгляд.
Если уж прям вообще никак не обойти (а это ещё надо уточнить), то оберни экземпляр твоего union в класс-контейнер, а в этот контейнер добавь флажок в виртуальной функции - isUnion(). Может, и без виртуальности получится, если у тебя шаблоны
|
|
|
Записан
|
|
|
|
oktonion
Постоялец
Offline
|
|
« Ответ #6 : 24-06-2019 14:15 » |
|
Следующий вопрос: а зачем? Что будем меняться для union и class?
Странный вопрос немного. К примеру от union отнаследоваться нельзя будет. oktonion, в новые стандарты ввели флаги, чтобы было проще разбираться в старом коде. Но всё же лучше избегать union, на мой взгляд.
Если уж прям вообще никак не обойти (а это ещё надо уточнить), то оберни экземпляр твоего union в класс-контейнер, а в этот контейнер добавь флажок в виртуальной функции - isUnion(). Может, и без виртуальности получится, если у тебя шаблоны
Код чужой. Моего union там нет, там есть вражеский тип с которым нужно корректно работать. Я ничего о вражеском типе не знаю, потому и необходимо определять что за зверь. Но мы как-то от темы вопроса отклоняемся.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #7 : 24-06-2019 22:39 » |
|
Ну и отлично, ошибка компиляции.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 25-06-2019 04:42 » |
|
oktonion, от темы вовсе не отклоняемся
но всё ещё непонятен вопрос: если о типе ничего не знаешь, как ты будешь с ним работать ? Ну а если знаешь о нём, что его нужно всячески оберегать - это по любому нужно обёртку делать
давай какую-то конкретно возникшую проблему с этим кодом опиши
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #9 : 25-06-2019 07:14 » |
|
Да, пример было бы очень интересно увидеть. Мне еще не разу не встречался union как конечный тип, всегда в struct его прячут.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
oktonion
Постоялец
Offline
|
|
« Ответ #10 : 25-06-2019 10:58 » |
|
oktonion, от темы вовсе не отклоняемся
но всё ещё непонятен вопрос: если о типе ничего не знаешь, как ты будешь с ним работать ? Ну а если знаешь о нём, что его нужно всячески оберегать - это по любому нужно обёртку делать
давай какую-то конкретно возникшую проблему с этим кодом опиши
Вот я об этом отклонении и говорю. У меня вопрос - как определить что передан union как шаблонный параметр. У вас речь про "конкретную проблему с этим кодом". Нет проблемы с кодом у меня, у меня есть проблема определить что тип - union =) Я - автор библиотеки, а для чего там пользователь будет использовать is_union - его дело. Как синтетический пример использования можно выдумать вот такое: template<class T, bool TCanBeParent = std::is_class<T>::value, bool TIsUnion = std::is_union<T>::value> struct SuperStruct;
template<class T> struct SuperStruct<T, true, false>: public T { using T::set; };
template<class T> struct SuperStruct<T, false, false>: public T { void set(const T &value_) {value = value_;} private: T value; };
template<class T> struct SuperStruct<T, false, true>: public T { template<class TT> void set(const TT &value_) {obj.set(value_);} private: T obj; };
Но, повторюсь, проблемы с данным кодом у меня нет. У меня есть проблема с определением union на этапе компиляции.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 25-06-2019 11:14 » |
|
oktonion, Берём твой первый пост A union shall not be used as a base class. делаем тест //это класс, который хотим протестировать union my_union { };
//это оболочка для классов-тестеров.(можно и без неё, впрочем) struct test_class { //...но для строгости делаем невозможным использование тестеров в общем коде private:
//тестер №1 - класс не скомпилируется, если my_union является union struct tester1:public my_union { }; }; Чтобы разрешить использовать таки union, придётся заставить пользователя использовать шаблон с другим именем, который будет уметь работать с union (интересно, что он там такое будет делать? ) Но какое-то это сильное усложнение. Лучше написать в описании - "не советую использовать union"
|
|
« Последнее редактирование: 25-06-2019 11:24 от Алексей++ »
|
Записан
|
|
|
|
oktonion
Постоялец
Offline
|
|
« Ответ #12 : 25-06-2019 14:39 » |
|
Эх. Это и так понятно. А что на счет моего вопроса то? =)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 25-06-2019 15:43 » |
|
oktonion, ответ, видимо, такой: до C++11 нет штатного способа. И искать какую-то магию тут бесполезно
|
|
|
Записан
|
|
|
|
oktonion
Постоялец
Offline
|
|
« Ответ #14 : 25-06-2019 16:11 » |
|
oktonion, ответ, видимо, такой: до C++11 нет штатного способа. И искать какую-то магию тут бесполезно
То что штатного способа нет это тоже понятно, ведь в этом вся суть. Вопрос в том какие еще отличия, кроме приведенной цитаты, есть у union и class?
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #15 : 26-06-2019 14:39 » |
|
У меня вопрос - как определить что передан union как шаблонный параметр. У вас речь про "конкретную проблему с этим кодом". Нет проблемы с кодом у меня, у меня есть проблема определить что тип - union =) Я - автор библиотеки, а для чего там пользователь будет использовать is_union - его дело.
Ну раз это ваша библиотека, то вопрос в том, что она вообще такого будет делать с типами, как она их использовать планирует. Например, не очень понятно, зачем библиотеке может понадобиться наследоваться от пользовательского типа. Как параметр шаблона ещё ладно, но как можно построить специализацию в виде потомка для типа, чьё устройство и назначение заведомо неизвестны?
|
|
|
Записан
|
|
|
|
|
|