Russian Qt Forum
Ноябрь 23, 2024, 08:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Пустая структура  (Прочитано 9296 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Ноябрь 01, 2014, 15:35 »

Добрый день

Увидел такой приемчик

Код
C++ (Qt)
 
static struct StepTy {
} step MAYBE_UNUSED;
 
static struct EmptyTy {
} empty MAYBE_UNUSED;
 

Макруха для понту, можно не обращать внимания
Код
C++ (Qt)
 
#ifdef __GNUC__
 #define MAYBE_UNUSED __attribute__((used))
#else
 #define MAYBE_UNUSED
#endif
 

И оказывается, "пустые" структуры очень лихо юзаются  Улыбающийся
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #1 : Ноябрь 01, 2014, 19:00 »

Используются. Ну и ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Ноябрь 01, 2014, 19:03 »

Используются. Ну и ?
То Вы такой продвинутый, а для меня это было маленьким открытием. Типа "во, блин, и так можно" Улыбающийся
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #3 : Ноябрь 01, 2014, 19:10 »

а для меня это было маленьким открытием. Типа "во, блин, и так можно"

Сказать "вау!"  - это единственная причина создания этой темы?
Записан
Bepec
Гость
« Ответ #4 : Ноябрь 01, 2014, 20:19 »

Бредовая тема, если честно.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Ноябрь 01, 2014, 21:43 »

Объясните, пожалуйста, а для чего нужны пустые структуры?
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Ноябрь 02, 2014, 11:54 »

Объясните, пожалуйста, а для чего нужны пустые структуры?
Пример использования

Код
C++ (Qt)
struct BBox {
BBox( void ) {}
BBox( EmptyTy ) : lower(inf), upper(-inf) {}
..
};
..
BBox box(empty);
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Ноябрь 02, 2014, 17:15 »

Объясните, пожалуйста, а для чего нужны пустые структуры?
Пример использования

Код
C++ (Qt)
struct BBox {
BBox( void ) {}
BBox( EmptyTy ) : lower(inf), upper(-inf) {}
..
};
..
BBox box(empty);

Структура не пустая: есть конструкторы и судя по второму конструктору, присутствуют поля lower и upper.

В первом сообщение показаны 2 структуры, и мне не понятно зачем они вообще нужны? Какую роль выполняют Улыбающийся
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Ноябрь 02, 2014, 19:59 »

Структура не пустая: есть конструкторы и судя по второму конструктору, присутствуют поля lower и upper.

В первом сообщение показаны 2 структуры, и мне не понятно зачем они вообще нужны? Какую роль выполняют Улыбающийся
Второй конструктор BBox принимает аргумент EmptyTy (пустая структура из первого сообщения)
Записан
Bepec
Гость
« Ответ #9 : Ноябрь 02, 2014, 20:49 »

В общем как то используются, а как он объяснить не может Улыбающийся
Приведите полный код структуры использующей пустую структуру Улыбающийся
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #10 : Ноябрь 02, 2014, 20:53 »

Пример использования: O Boost Multi-index Containers
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #11 : Ноябрь 02, 2014, 22:09 »

Пример использования: O Boost Multi-index Containers

Вижу Улыбающийся
Записан

_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #12 : Ноябрь 03, 2014, 00:04 »

Пример использования: O Boost Multi-index Containers

Вы ошибаетесь. Пример ввел вас в заблуждение.

Если вы ещё раз внимательно посмотрите на этот пример, то вы заметите: нигде не используются объекты типов-тэгов.

Другими словами, этим структурам вообще не нужны определения (не нужны туловища).
Достаточно будет forward declaration.
И поэтому этот пример не может быть примером использования пустышек.
---------------------------------------


Вот настоящий пример использования пустышек:


В рамках с++03 реализация имитации variardic template (функций с переменным количеством аргументов, с сохранением типо безопасности):

Код:
void Foo(Arg a1, Arg a2 = SEmpty(), Arg a3 = SEmpty() )
{
    ...
}

Здесь можно указать от 1 до 3х аргументов.

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

При вызове функции Foo, все не указанные аргументы по умолчанию превратятся в пустышку SEmpty.

Внутри туловища функции Foo ожидают, что часть аргументов может быть пустышками.
Там умеют корректно обработать "отсутствие аргумента".

В те времена, когда ещё не было variardic template, данная практика позволяла написать всего одну не шаблонную функцию,  вместо перегрузки множества шаблоно-функций.

И поскольку, функция не шаблонная, её можно сделать виртуальной.

Отсюда главная фишка метода - таким образом можно изготовить "имитацию виртуальной шаблоно-функции с переменным количеством аргументов".
« Последнее редактирование: Ноябрь 03, 2014, 00:07 от _Bers » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Ноябрь 03, 2014, 08:17 »

Вы ошибаетесь. Пример ввел вас в заблуждение.
Это open-sources которые я сейчас прикручиваю. Не вижу где я ошибаюсь Улыбающийся Пример из буста намного сложнее, но смысл тот же: пустышка "натравливает" на вызов именно этой ф-ции/метода, где знают что делать. 

В рамках с++03 реализация имитации variardic template (функций с переменным количеством аргументов, с сохранением типо безопасности):

Код:
void Foo(Arg a1, Arg a2 = SEmpty(), Arg a3 = SEmpty() )
{
    ...
}

Здесь можно указать от 1 до 3х аргументов.

Arg - это механизм, способный принять ссылку любого объекта и проконтролировать типо безопасность.
(при извлечении будет выполнена проверка квалификаторов и типов)
Под извлечением имелась ввиду "инстанциация"? Но ведь ф-ция не template. Непонятно, объясните.

Спвсибо
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #14 : Ноябрь 03, 2014, 10:51 »

По-моему, самое очевидный пример использования таких структур/классов - в обработке исключений.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.13 секунд. Запросов: 23.