Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование тьюпл как общей сущности взамен стру, ктур 
V
    Опции темы
boostcoder
Дата 15.9.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Всем доброго дня.
Так как все топовые производители зарелизили версии компиляторов поддерживающих c++0x, встал резонный вопрос: почему бы вместо всеобразных типов структур, не использовать тьюплы? Идея в том, чтоб не плодить сущности.
Например:
Код

struct point_t {
   int x;
   int y;
};

struct point3d_t {
   int x;
   int y;
   int z;
};

struct rect_t {
   point_t left;
   point_t right;
};

struct rect3d_t {
   point3d_t left;
   point3d_t right;
};

Что мы имеем в итоге: четыре разных типа, и четыре разных сущности.
Какие у такого способа плюсы - я не знаю. Минусы - очевидны. Обобщить алгоритмы работающие с этими типами можно, посредством шаблонов или адаптеров(переходников). Но смысл в этом какой? - я, честно говоря, не понимаю.

Представьте ситуацию, в которой, все эти типы были бы тьюплами:
Код

typedef std::tuple<int, int> point_t;
typedef std::tuple<int, int, int> point3d_t
typedef std::tuple<point_t, point_t> rect_t;
typedef std::tuple<point3d_t, point3d_t> rect3d_t;

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

Собственно, реализовать общение к членам, пытаюсь с помощью препроцессора.
Предварительный пример:
Код

DECLARE_TUPLE(point_t)
   DECLARE_MEMBER(int, x)
   DECLARE_MEMBER(int, y)
END_TUPLE()


Интересует ваше мнение.

зы
как все же правильно они называются, тьюплы или кортежи?
PM WWW   Вверх
djamshud
Дата 15.9.2010, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



>как все же правильно они называются, тьюплы или кортежи?

Кортеж - это перевод тюпла на великий и могучий. К.О.

Минусы:

 - конпеляторы топовых версий - дрянь;
 - нет совметимости с си.

Но вообще штука годная, я сам стараюсь использовать pair вместо простых структур.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
boostcoder
Дата 15.9.2010, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(djamshud @  15.9.2010,  16:08 Найти цитируемый пост)
- конпеляторы топовых версий - дрянь;

какой из них?: gcc, msvc, edg, comeau, intel?

Это сообщение отредактировал(а) boostcoder - 15.9.2010, 16:10
PM WWW   Вверх
azesmcar
Дата 15.9.2010, 16:12 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(djamshud @  15.9.2010,  16:08 Найти цитируемый пост)
Но вообще штука годная, я сам стараюсь использовать pair вместо простых структур. 

а принудительное использование first и second вместо вразумительных имен никак не смущает?
PM   Вверх
djamshud
Дата 15.9.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



Думаю, все. Топовая версия - это, считай, немного устаканенный транк. Багов обычно нет, а регрессий - море. Помните эпичный фэйл, когда гцц 4.5 и 4.6 не могли ничего заинлайнить? Так вот это только один из примеров. Если немного следить за выпусками гцц и сопутствующими обсуждениеми, видно, что на топе куча плюшек и куча регрессий, а потом в промежуточных версиях регрессии убирают.

Например гцц 4 в сравнении с гцц 3 был просто кошмаром и только к ветке 4.4 от регрессий начали избавляться и вообще вся ветка 4.4 - это по большей части багфикс с небольшими бэкпортами новых фич.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
boostcoder
Дата 15.9.2010, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  15.9.2010,  16:12 Найти цитируемый пост)
а принудительное использование first и second вместо вразумительных имен никак не смущает? 

да. бывают моменты когда хочется задекларировать десятку-две структур smile 
PM WWW   Вверх
djamshud
Дата 15.9.2010, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



azesmcar, меня не смущает, потому что называю их key и value, а структуры такие нужны обычно только в таком качестве. Второе известное мне применение - координаты, - но тут использую struct.

upd. Третьих и четвертых впрочем тоже можно придумать. Суть в том, что на моей практике обычно все сводится к ключ-значение.

Это сообщение отредактировал(а) djamshud - 15.9.2010, 16:23


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
azesmcar
Дата 15.9.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  15.9.2010,  16:19 Найти цитируемый пост)
да. бывают моменты когда хочется задекларировать десятку-две структур smile  

ну по моему
Код

rect r;
r.bottom = 20;
r.top = 10;
r.left = 15;
r.right = 50;

читается намного легче, чем
Код

rect r;
r.first.first = 20;
r.first.second = 10;
r.second.first = 15;
r.second.second = 50;


Добавлено через 1 минуту и 9 секунд
Цитата(djamshud @  15.9.2010,  16:20 Найти цитируемый пост)
azesmcar, меня не смущает, потому что называю их key и value, а структуры такие нужны обычно только в таком качестве. 

насколько я понял ТС спрашивал про использование тюплов всегда и везде, вместо структур, а на мой взгляд это затрудняет чтение кода.

Добавлено через 1 минуту и 21 секунду
Цитата(djamshud @  15.9.2010,  16:20 Найти цитируемый пост)
Второе известное мне применение - координаты, - но тут использую struct. 

 smile 
PM   Вверх
boostcoder
Дата 15.9.2010, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  15.9.2010,  16:23 Найти цитируемый пост)
насколько я понял ТС спрашивал про использование тюплов всегда и везде, вместо структур

по большому счету - да.

Цитата(azesmcar @  15.9.2010,  16:23 Найти цитируемый пост)
а на мой взгляд это затрудняет чтение кода.

да. если использовать std::get<>() для обращения к членам.

но если свести синтаксис к:
Код

rect r;
r.bottom = 20;
r.top = 10;
r.left = 15;
r.right = 50;

то это не в счет smile 
PM WWW   Вверх
kemiisto
Дата 15.9.2010, 16:36 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 2
Всего: 160



Цитата(boostcoder @  15.9.2010,  16:47 Найти цитируемый пост)
как все же правильно они называются, тьюплы или кортежи?

Кортежи. Зачем использовать кальку с английского, когда в русском языке уже есть устоявшийся термин?

Цитата(boostcoder @  15.9.2010,  16:47 Найти цитируемый пост)
Интересует ваше мнение.

У меня для Вас плохие новости. smile Вот чем, пожалуй, отличаются программисты С++, так это неуёмны желанием использовать всё и вся не по назначению. Помните, у вас в руках инструмент ещё более острый, чем та самая бритва. Ну и, конечно, первый друг "творца" в создании кровавого месива - препроцессор... Я повторяюсь...

Использовать кортежи как замену классам нужно крайне осторожно. Пожалуй, однозначно не стоит делать это в Public API. Интерпретировать трудно. Как только появилась необходимость передавать/возращать кортеж, надо начинать думать о создании класса/структуры.

Для "внутреннего применения" может пригодиться. Сценарий "навскидку":

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

Это сообщение отредактировал(а) kemiisto - 15.9.2010, 16:38


--------------------
PM MAIL WWW GTalk Jabber   Вверх
boostcoder
Дата 15.9.2010, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



так же, стоит вспомнить про std::tie(). что является огромным плюсом при работе с членами кортежей.

Добавлено @ 16:44
Цитата(kemiisto @  15.9.2010,  16:36 Найти цитируемый пост)
Ну и, конечно, первый друг "творца" в создании кровавого месива - препроцессор

в данном случае, не представляю, как без него тут обойтись...

Это сообщение отредактировал(а) boostcoder - 15.9.2010, 16:46
PM WWW   Вверх
bsa
Дата 15.9.2010, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Кортежи использовать вместо структур глупо. Использовать вместо координат неразумно, так как читабельность падает. Для "ключ-значение" они больше подходят, но опять же, если есть лишние 10 минут, лучше накатать специальную структурку.

На мой взгляд, они нужны исключительно для создания сложных шаблонных творений (а-ля boost::bind), когда типы и количество членов кортежа определяется в момент компиляции.

ИМХО
PM   Вверх
boostcoder
Дата 15.9.2010, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(bsa @  15.9.2010,  18:06 Найти цитируемый пост)
Кортежи использовать вместо структур глупо

ок...

Цитата(bsa @  15.9.2010,  18:06 Найти цитируемый пост)
Использовать вместо координат неразумно

координаты - это просто пример. первое, тривиальное, что в голову пришло.

Цитата(bsa @  15.9.2010,  18:06 Найти цитируемый пост)
читабельность падает

уже ответил -
Цитата(boostcoder @  15.9.2010,  16:34 Найти цитируемый пост)
но если свести синтаксис к:
rect r;
r.bottom = 20;
r.top = 10;
r.left = 15;
r.right = 50;


Цитата(bsa @  15.9.2010,  18:06 Найти цитируемый пост)
Для "ключ-значение" они больше подходят, но опять же, если есть лишние 10 минут, лучше накатать специальную структурку.

чем лучше?

Цитата(bsa @  15.9.2010,  18:06 Найти цитируемый пост)
На мой взгляд, они нужны исключительно для создания сложных шаблонных творений (а-ля boost::bind), когда типы и количество членов кортежа определяется в момент компиляции.

увы.
посмотрите на великолепное творение - boost.fusion. воистину великолепное smile 
PM WWW   Вверх
azesmcar
Дата 15.9.2010, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  15.9.2010,  16:34 Найти цитируемый пост)
но если свести синтаксис к:

каким образом? с помощью макросов? чем тогда тюплы от обычных структур отличаются, разве что тем, что объявляться нестандартно и опять таки затрудняют чтение. В общем я думаю так, если прибегать к каким-то нестандартным методом на то должно быть основание. Так в чем причина использования тюплов вместо структур? Что вы выигрываете? 
PM   Вверх
boostcoder
Дата 15.9.2010, 20:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  15.9.2010,  20:26 Найти цитируемый пост)
чем тогда тюплы от обычных структур отличаются

сущность одна - кортеж.
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0638 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.