Заглянул тут в книжку Вандервурда. Там в главе про Tupple, штука такая есть — val<n>. Удобно конечно, но у меня возникла идея, возможно старая как мир. Но таки приведу её на правах прикола.
Здравствуйте, Alexey Chen, Вы писали:
AC>Заглянул тут в книжку Вандервурда. Там в главе про Tuple, штука такая есть — val<n>. Удобно конечно, но у меня возникла идея, возможно старая как мир. Но таки приведу её на правах прикола.
Я так понял, идея понравилась.
Тогда расскажу продолжение истории...
Кода я попробывал скомпилировать пример в шестой студии, получил весьма неприятное сообщение. Дескать, опреатор [] уже определён. Так пришлось отказатьса от using'а.
Но как же разрешить такую проблему, спросил я себя: Использовать опреаторы базовых шаблонных классов я не могу ибо компилятор их не видит, использовать явное указание компилятору я тоже не могу, он этого не понимает.
Однако, надо писать шаблонный оператор. Оператор, который будет в зависимости от ключа возвращать значение из нужной базы. Ну вы уже понимаете на какую фичу C++ я наткнулся? Правильно, у любой функции обязятельно должн быть задан тип для возвращаемого значения. Автоопределения типа по выраженияю в С++ нет.
Ну что же, значит надо определять тип по ключу. Реально это не сложно, просто рекурсивный шаблон. Но тут шестая студия подставила мне очередную подножку. Ага, она не может вычислять тип возвращаемого значения. Параметр шаблона там стоять может, но элемент другого шаблона параметризированный параметром — нет.
Вот теперь мне стало действительно весело. Нужно было кардинально другое решение, и я его таки родил.
Идея вобщем-то простая — пеменять ключ и контейнер местами. Но таки _идея_! Возможно кому-то она поможет выкрабкаться из более тяжёлой ситуации. Чем то это похоже на функции селекторы, но принципиальное отличие в структуре, кторую можно рефлексировать.
Собственно реализация для тех кому интересно. ИМХО, имеет чисто академический интерес.
On Tue, 21 Jun 2005 18:37:02 +0400, Alexey Chen <17658@users.rsdn.ru> wrote:
> Заглянул тут в книжку Вандервурда. Там в главе про Tupple, штука такая есть — val<n>. Удобно конечно, но у меня возникла идея, возможно старая как мир. Но таки приведу её на правах прикола. > >
> > PS: > Выкриков — 'баян' и тухлых помидоров я не боюсь, ибо действительно прикольно.
Возможно это "действительно прикольно", но абсолютно бесполезно.
Проблем с этим tuple'ом две: Сам факт, что до объявления кортежа нужно объявить имена его членов, а при объявлении объявить имена и их типы убивают всю идею на корню. Я не вижу, чем приведенный выше кортеж лучше, чем обычное
struct my_struct
{
int height;
float weight;
std::string name;
};
Я вижу лишь что на описание этой же структуры в оригинальном коде ушло больше писанины без какой либо пользы.
Практическая применимость такого кортежа в шаблонном коде близка к абсолютному нулю. Ничего не стоит в compile time определить количество членов boost::tuple и проитерироваться по его членам, так как индексом его членов является целое, результаты арифметических операций над которым вычисляются в compile time. По приведенному кортежу невозможно проитерироваться в generic коде, так как нужно знать имена членов. Возвращемся к тому, что индексы должны быть простыми целыми.
С другой стороны целочисленные индексы не убивают возможности использовать осмысленные имена. boost::tuple:
Я не вижу недостатка в том, что вместо operator[] для доступа к членам используется get<>(), так как реально никакого практического смыла в operator[] нет из-за того, что он не может использоваться в generic коде который ожидает семантику operator[] как у встроенных типов.
-- Maxim Yegorushkin
Здравствуйте, MaximE, Вы писали:
ME>Я вижу лишь что на описание этой же структуры в оригинальном коде ушло больше писанины без какой либо пользы. ME> Практическая применимость такого кортежа в шаблонном коде близка к абсолютному нулю. Ничего не стоит в compile time определить количество членов boost::tuple и проитерироваться по его членам, так как индексом его членов является целое, результаты арифметических операций над которым вычисляются в compile time. По приведенному кортежу невозможно проитерироваться в generic коде, так как нужно знать имена членов. Возвращемся к тому, что индексы должны быть простыми целыми.
Не буду спорить. Просто спрошу: что если я решал другую задачу, о которой Вы даже не подумали? Что если 'обобщённый код' не всегда совпадает с Modern C++ и метопрограммирование? Возможно есть и другие способы написания программ кроме как boost::... Наверное, но науке это, как водится, не известно.
Однако сей вопрос к топику дела не имеет. Имеет дело другой. Вы всегда пишете только практически применимый самодостаточный неизбыточный код, максимально эффективно решающий задачу? Ответ можно в топик про то кто такие кодеры.
Это была идея. Просто идея описания структуры в читабельном виде с возможностью рефлексии. Но не для использования_каждым_пионером_в_любом_месте_в_которое_он_только_сможет_это_воткнуть. Лично я рассматриваю такие вещи как искусство. Как на это смотреть другим, это их дело. _Мне_ нравится.
Где и зачем может понадобиться такой приём я не буду расписывать, это уже специфика. Специфика же порождает непонимание людей не сталкивавшихся с ней. ИМХО, кому надо сам поймёт нужен ему такой приём или нет, я же просто поделился идеей. Лично вам идея не понравилась? Ну и ладно.
Здравствуйте, Alexey Chen, Вы писали:
AC>Не буду спорить. Просто спрошу: что если я решал другую задачу, о которой Вы даже не подумали?
И что за задача? Она правда не решается с помощью boost.tuples? Не верю.
AC>Что если 'обобщённый код' не всегда совпадает с Modern C++ и метопрограммирование? Возможно есть и другие способы написания программ кроме как boost::... Наверное, но науке это, как водится, не известно.
Способы безусловно есть, но согласись boost удобней. Если сделаешь лучше — круто — но пока я не вижу, что это у тебя получилось.
AC>Однако сей вопрос к топику дела не имеет. Имеет дело другой. Вы всегда пишете только практически применимый самодостаточный неизбыточный код, максимально эффективно решающий задачу? Ответ можно в топик про то кто такие кодеры.
Извини конечно, но смысла я вообще не вижу в твоем коде, я могу получить то же самое с более c удобным синтаксисом и гораздо более простым повторным использованием (boost::tuples).
AC>Это была идея. Просто идея описания структуры в читабельном? виде с возможностью рефлексии. Но не для использования_каждым_пионером_в_любом_месте_в_которое_он_только_сможет_это_воткнуть. AC>Лично я рассматриваю такие вещи как искусство.
Искусство лишь тогда когда есть смысл и удобный синтаксис, здесь я его не вижу, а вот то, как написаны boost::tuples и boost::bind — это уже искусство и какой сделать такой syntactic sugar для пользователя.
AC>Как на это смотреть другим, это их дело. _Мне_ нравится.
Эт пожалуйста. Но лично я согласен с Максимом на 100%.
AC>Где и зачем может понадобиться такой приём я не буду расписывать, это уже специфика. Специфика же порождает непонимание людей не сталкивавшихся с ней. ИМХО, кому надо сам поймёт нужен ему такой приём или нет, я же просто поделился идеей.
Да нигде не понадобится. И синтаксис хромает, и удобство, да и смысла мало...
Извини если что это все имхо, но в некоторых местах достаточно объективное...
Здравствуйте, Pavel Chikulaev, Вы писали:
AC>>Не буду спорить. Просто спрошу: что если я решал другую задачу, о которой Вы даже не подумали? PC>И что за задача? Она правда не решается с помощью boost.tuples? Не верю.
Твоё право. Но я не буду постить здесь кода больше чем на экран. И ни кому ни чего доказывать тоже не буду. Я не для для сюда пришёл. А делать же лучше, круче, моднее... длиной без меня пожалуйста мерейтесь. Я всего лишь показал интересную _на_мой_ взгляд идею. Ты считаешь что это бред. Пожалуйста, и разубеждать тебя в этом я не буду. Зачем мне это? Будем считать что ты прав, и меня после пива в голове помутнение возникло, захотелось чегой-то изобразить. Пускай для тебя это будет обьяснением моей задачи. Ок?
PC>Извини конечно, но смысла я вообще не вижу в твоем коде, я могу получить то же самое с более c удобным синтаксисом и гораздо более простым повторным использованием (boost::tuples).
Дык, уже как-то пытался обьяснить что 'смысла я вообще не вижу' и 'вижу что смысла вообще нет' не одно и то же. Но прекратил попытки это делать. Бесполезное занятие.
PC>Извини если что это все имхо, но в некоторых местах достаточно объективное...
Дык, это публичный форум. Здесь любое мнение 'обьективное'
On Sun, 26 Jun 2005 21:19:54 +0400, Alexey Chen <17658@users.rsdn.ru> wrote:
[]
> Не буду спорить.
Спорить нам не нужно. Приведи конкретные преимущества твоей идеи на конкретном реальном примере.
> Просто спрошу: что если я решал другую задачу, о которой Вы даже не подумали? Что если 'обобщённый код' не всегда совпадает с Modern C++ и метопрограммирование? Возможно есть и другие способы написания программ кроме как boost::... Наверное, но науке это, как водится, не известно.
Нам, простым смертным кодерам, не терпится достигнуть просветления и узнать ту высокую задачу, которую хранит твое чело. (прости, — не совершенен, не удержался )
> Однако сей вопрос к топику дела не имеет. Имеет дело другой. Вы всегда пишете только практически применимый самодостаточный неизбыточный код, максимально эффективно решающий задачу? Ответ можно в топик про то кто такие кодеры.
Последнее время — да, screw genericity. Следующая философия мне близка http://www.faqs.org/docs/artu/ch01s06.html
> Это была идея. Просто идея описания структуры в читабельном виде с возможностью рефлексии. Но не для использования_каждым_пионером_в_любом_месте_в_которое_он_только_сможет_это_воткнуть. Лично я рассматриваю такие вещи как искусство. Как на это смотреть другим, это их дело. _Мне_ нравится. > > Где и зачем может понадобиться такой приём я не буду расписывать, это уже специфика. Специфика же порождает непонимание людей не сталкивавшихся с ней. ИМХО, кому надо сам поймёт нужен ему такой приём или нет, я же просто поделился идеей. Лично вам идея не понравилась? Ну и ладно.
Еще раз попрошу конкретный пример, а не нытье про хрупкую душу художника, которую не просто понять. Мы — инженеры, форум технический, поэтому best ideas only.
Здравствуйте, MaximE, Вы писали:
ME>On Sun, 26 Jun 2005 21:19:54 +0400, Alexey Chen <17658@users.rsdn.ru> wrote:
>> Не буду спорить. ME>Спорить нам не нужно. Приведи конкретные преимущества твоей идеи на конкретном реальном примере.
Простите, приемущества перед чем? Я где-то написал что вот дескать придумал нечто супер крутое, которое порвет (ну например) boost как тузик грелку? Может я сказал что написал мега tuple и всем три раза сказать ку? Я поделился идей, почему я ещё должен кому-то доказывать, что эта стоящая идея?! НЕ БУДУ этого делать! В принципе.
Не понял ты зачем это надо, ну дык, а я то тут при чём?
Я уже привёл пример задачи вашему единомышленнику, повторяться не буду.
AC> Просто спрошу: что если я решал другую задачу, о которой Вы даже не подумали? Что если 'обобщённый код' не всегда совпадает с Modern C++ и метопрограммирование? Возможно есть и другие способы написания программ кроме как boost::... Наверное, но науке это, как водится, не известно. ME>Нам, простым смертным кодерам, не терпится достигнуть просветления и узнать ту высокую задачу, которую хранит твое чело. (прости, — не совершенен, не удержался )
А я и не сомневался
*в сторону* нда, я на личности не переходил.
Может повесим на входе табличку:
Каждый желающий запостить идею или пример кода должен приложить подробно разжёванное описание (понятное для кофейников), а так же примеры на которых доступно показано чем его идея лучше чем boost. Примеры должны быть написаны в терминах буста с использованием буста и на задачах решаемых бустом. Отсутствие буста в примерах и идее, а так же непонимание почитателями буста, почему таковое кому либо может быть интересно, карается всеобщем порицанием и удалением.
А? Как тебе такая идея? Тогда я точно постить ничего не буду. И тебе будет сухо и комфортно.
(Особенно в духе идей об общем уровне форума)
Можно ещё переименовать форум из C++ в BOOST++, тогда наверное наступит всеобщее счастье и просветление.
Здравствуйте, Alexey Chen, Вы писали:
AC>Заглянул тут в книжку Вандервурда. Там в главе про Tupple, штука такая есть — val<n>. Удобно конечно, но у меня возникла идея, возможно старая как мир. Но таки приведу её на правах прикола.
Я так понял по откликам мастеров пера, что надо обьяснить суть идеи.
Суть проста. Использовать для индексирования полей структуры типы. В отличии от кортежа, который я упомянул в начале топика, такой подход имеет смысл для создания метаинформации о структуре при сохранении естественного доступа к её (структуры) элементам. И, что важно, не отменяет возможности доступа по номеру. Иначе говоря это тот же tuple, но с хуманридабл тегами.
Это позволяет писать понятный код и с минимальными усилиями реализовывать например сериализацию.
Да конечно можно и так, только это совсем не то. Да и ещё надо не забыть поддерживать соответствие перечисления и кортежа.
Второй пример — это адаптация под примитивный компилятор. Но суть идеи не в самой адаптации, а в приёме который для этого использован. Кстати, сам код может также подтолкнуть к некоторым интересным идеям, но уже архитектурным.
On Mon, 27 Jun 2005 00:04:21 +0400, Alexey Chen <17658@users.rsdn.ru> wrote:
> ME>Спорить нам не нужно. Приведи конкретные преимущества твоей идеи на конкретном реальном примере. > > Простите, приемущества перед чем?
Здравствуйте, MaximE, Вы писали:
>> Простите, приемущества перед чем? ME>Перед обыкновенной структурой.
Ах, Вы про это. Наверное надо было явно упомянуть, что данный приём позволяет перебрать все поля ака tuple при этом сохраняет читабельность структуры и допускает определение метаинформации для реализации рефлекшина. Такого обьяснения достаточно или надо подробнее?
Извините, что написал только идею, надо наверное было писать много много кода, чтобы идеи было не видно, но зато было много неймспейсов, шаблонов и макросов. Как я посмотрю нынче это очень популярный способ изложения.
Здравствуйте, MaximE, Вы писали:
ME>On Sun, 26 Jun 2005 21:19:54 +0400, Alexey Chen <17658@users.rsdn.ru> wrote:
ME>[]
>> Не буду спорить.
ME>Спорить нам не нужно. Приведи конкретные преимущества твоей идеи на конкретном реальном примере.
Извините, коллеги, что вмешиваюсь в ваш холивар, но мне показалось (на первый взгляд, я не проверял на компиляторе), что в решении Alexey Chen
(такие значения могут потребоваться, например, для управления каким-то внешним устройством).
В то время как в boost::tuple необходимо использовать значения от 0 до k-1:
get<N>(t)
where t is a tuple object and N is a constant integral expression specifying the index of the element to be accessed. Depending on whether t is const or not, get returns the Nth element as a reference to const or non-const type. The index of the first element is 0 and thus N must be between 0 and k-1, where k is the number of elements in the tuple. Violations of these constrains are detected at compile time.
А вообще, по количеству упоминаний boost-а в данном форуме, слова Алексея (Re[4]: Aka Tuple
Каждый желающий запостить идею или пример кода должен приложить подробно разжёванное описание (понятное для кофейников), а так же примеры на которых доступно показано чем его идея лучше чем boost. Примеры должны быть написаны в терминах буста с использованием буста и на задачах решаемых бустом. Отсутствие буста в примерах и идее, а так же непонимание почитателями буста, почему таковое кому либо может быть интересно, карается всеобщем порицанием и удалением.
Оказываются довольно актуальными
Все же boost пока не стандарт, не везде работает, да и могут быть административно/политические причины не использовать boost. Поэтому я не думаю, что нужно обязательно при публикации какой-то идеи проводить ее сравние с boost-ом. А то это начинает напоминать проверки на соответствие "генеральной линии партии и коммунистической идеологии" в недавние времена
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
On Mon, 27 Jun 2005 02:22:58 +0400, Alexey Chen <17658@users.rsdn.ru> wrote:
>>> Простите, приемущества перед чем? > ME>Перед обыкновенной структурой. > > Ах, Вы про это. Наверное надо было явно упомянуть, что данный приём позволяет перебрать все поля ака tuple при этом сохраняет читабельность структуры и допускает определение метаинформации для реализации рефлекшина. Такого обьяснения достаточно или надо подробнее?
Недостаточно. Напиши, пожалуйста, шаблон ф-ции, которая будет итерироваться по членам твоего кортежа (такая ф-ция необходима для реализации упомянутого тобой рефлекшена).
> (такие значения могут потребоваться, например, для управления каким-то внешним устройством). > > В то время как в boost::tuple необходимо использовать значения от 0 до k-1:
Не вижу как эту возможность иожно применить на практике.
> > А вообще, по количеству упоминаний boost-а в данном форуме, слова Алексея (Re[4]: Aka Tuple
[]
> Все же boost пока не стандарт, не везде работает, да и могут быть административно/политические причины не использовать boost. Поэтому я не думаю, что нужно обязательно при публикации какой-то идеи проводить ее сравние с boost-ом. А то это начинает напоминать проверки на соответствие "генеральной линии партии и коммунистической идеологии" в недавние времена
Я хочу лишь один малюсенький пример реального кода, где такой кортеж решает задачу лучше, чем обыкновенная структура или boost::tuple. Сранение с boost'ом пришлось потому, что там тоже есть кортеж, доступ к элементам которого, в отличие от приведенного кортежа, можно осуществить в generic коде.
Здравствуйте, Alexey Chen, Вы писали:
AC>Здравствуйте, Alexey Chen, Вы писали:
AC>>Заглянул тут в книжку Вандервурда. Там в главе про Tupple, штука такая есть — val<n>. Удобно конечно, но у меня возникла идея, возможно старая как мир. Но таки приведу её на правах прикола.
См. Александреску, а потом boost::tuples, а потом boost::mpl...
AC>Я так понял по откликам мастеров пера, что надо обьяснить суть идеи.
AC>Суть проста. Использовать для индексирования полей структуры типы. В отличии от кортежа, который я упомянул в начале топика, такой подход имеет смысл для создания метаинформации о структуре при сохранении естественного доступа к её (структуры) элементам. И, что важно, не отменяет возможности доступа по номеру. Иначе говоря это тот же tuple, но с хуманридабл тегами.
Немного погодя покажу код, позволяющий делать следующее:
О пользователе надо заботится
AC>Это позволяет писать понятный код и с минимальными усилиями реализовывать например сериализацию.
Да ты что!
Ты наверно просто не в курсе:
AC>Второй пример — это адаптация под примитивный компилятор. Но суть идеи не в самой адаптации, а в приёме который для этого использован. Кстати, сам код может также подтолкнуть к некоторым интересным идеям, но уже архитектурным.
boost::tuples сделает твой пример по переносимости так что про это даже не вспоминай. Какие идеи? В компил-тайм длину посчитать или перевернуть список типов?
Здравствуйте, MaximE, Вы писали:
ME>On Mon, 27 Jun 2005 08:25:46 +0400, eao197 <31476@users.rsdn.ru> wrote:
ME>[]
>> Извините, коллеги, что вмешиваюсь в ваш холивар, но мне показалось (на первый взгляд, я не проверял на компиляторе), что в решении Alexey Chen
>> (такие значения могут потребоваться, например, для управления каким-то внешним устройством). >> >> В то время как в boost::tuple необходимо использовать значения от 0 до k-1:
ME>Не вижу как эту возможность иожно применить на практике.
Ну, применить на практике и найти случай, когда boost::tuple не будет работать, это немного разные вещи. Имхо, я показал enum-ы, которые нельзя использовать для доступа к элементами boost::tuple.
>> >> А вообще, по количеству упоминаний boost-а в данном форуме, слова Алексея (Re[4]: Aka Tuple
):
ME>[]
>> Все же boost пока не стандарт, не везде работает, да и могут быть административно/политические причины не использовать boost. Поэтому я не думаю, что нужно обязательно при публикации какой-то идеи проводить ее сравние с boost-ом. А то это начинает напоминать проверки на соответствие "генеральной линии партии и коммунистической идеологии" в недавние времена
ME>Я хочу лишь один малюсенький пример реального кода, где такой кортеж решает задачу лучше, чем обыкновенная структура или boost::tuple. Сранение с boost'ом пришлось потому, что там тоже есть кортеж, доступ к элементам которого, в отличие от приведенного кортежа, можно осуществить в generic коде.
А я думаю, что подобный пример следует требовать в случае, когда автор идеи начинает пропагандировать ее и навязывать вместо boost/ace/stlsoft/whatever. Здесь же, имхо, такого нет.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, MaximE, Вы писали:
ME> Сам факт, что до объявления кортежа нужно объявить имена его членов, а при объявлении объявить имена и их типы убивают всю идею на корню. Я не вижу, чем приведенный выше кортеж лучше, чем обычное ME>
ME>struct my_struct
ME> ...
ME>
+1
Но с другой стороны Alexey Chen просто ошибся, назвав это tuple. Это конечно не кортеж, это именно структура.
ME>Я вижу лишь что на описание этой же структуры в оригинальном коде ушло больше писанины без какой либо пользы. ME> Практическая применимость такого кортежа в шаблонном коде близка к абсолютному нулю. Ничего не стоит в compile time определить количество членов boost::tuple и проитерироваться по его членам, так как индексом его членов является целое, результаты арифметических операций над которым вычисляются в compile time. По приведенному кортежу невозможно проитерироваться в generic коде, так как нужно знать имена членов. Возвращемся к тому, что индексы должны быть простыми целыми.
Бред. Или я чего то не понимаю, или это типичный симптом пользователя буста(судя по количеству согласившихся). В данном случае можно спокойно обращаться к членам структуры по индексу, выяснять их количество, итерироваться в compile time. Я потратил ровно две минуты, чтобы написать такой код:
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>Немного погодя покажу код, позволяющий делать следующее:
Показываю Copyright мой. Не отвечаю за последствия от увиденного. Нервных прошу воздержаться от просмотра Работает на VC7.1 и VC8
Здравствуйте, MaximE, Вы писали:
ME>Я хочу лишь один малюсенький пример реального кода, где такой кортеж решает задачу лучше, чем обыкновенная структура или boost::tuple. Сранение с boost'ом пришлось потому, что там тоже есть кортеж, доступ к элементам которого, в отличие от приведенного кортежа, можно осуществить в generic коде.
Код приводить не буду, он слишком большой и неинтересный. Конкретное применение — например, реализация SMPP протокола, представление PDU таким картежем.
Вообще любое использование структуры которая нужна как человеку так и для предстваления в пакетном виде для передачи. При этом имеющая опциональные поля и транслируемая частично или полностью в из TLV.
Здравствуйте, Alexey Chen, Вы писали:
AC>Здравствуйте, MaximE, Вы писали:
ME>>Я хочу лишь один малюсенький пример реального кода, где такой кортеж решает задачу лучше, чем обыкновенная структура или boost::tuple. Сранение с boost'ом пришлось потому, что там тоже есть кортеж, доступ к элементам которого, в отличие от приведенного кортежа, можно осуществить в generic коде.
AC>Код приводить не буду, он слишком большой и неинтересный. Конкретное применение — например, реализация SMPP протокола, представление PDU таким картежем.
А вот с этого места, если можно, поподробнее.
Ты вообще PDU хочешь представлять такими кортежами? Т.е. типа submit_sm, deliver_sm и т.д.?
Или речь идет об optional TLV? Но ведь в одном только submit_sm этих TLV штук сорок (в smpp 5.0 я насчитал 44).
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.