Заглянул тут в книжку Вандервурда. Там в главе про 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++.
Здравствуйте, uw, Вы писали:
uw>Бред. Или я чего то не понимаю, или это типичный симптом пользователя буста(судя по количеству согласившихся). В данном случае можно спокойно обращаться к членам структуры по индексу, выяснять их количество, итерироваться в compile time. Я потратил ровно две минуты, чтобы написать такой код:
А что уже бустом пользоватся плохо? И там и здесь можно итерироватся. Но какая разница? Просто я очень не люблю велосипеды, особенно корявые и не доделанные, и с никаким удобством.
Две минуты — и что? Ты видимо не в курсе про boost::fusion
Я понимаю еще если буст не работает на твоей платформе... но ведь он скорее всего работает...
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>Здравствуйте, Pavel Chikulaev, Вы писали:
PC>>Немного погодя покажу код, позволяющий делать следующее: PC>Показываю Copyright мой. Не отвечаю за последствия от увиденного. Нервных прошу воздержаться от просмотра Работает на VC7.1 и VC8
Круто. Хм, только надо поменять return k на что-нить компиляющееся.
Хороший показательный пример программирования на BOOST++. Звиняй, но я пишу на С++, потому в моём коде ты таких диких конструкций не увидишь.
Здравствуйте, Alexey Chen, Вы писали:
AC>Круто. Хм, только надо поменять return k на что-нить компиляющееся.
Ну да и что Щас из-за debugной переменной будем устраивать...
AC>Хороший показательный пример программирования на BOOST++. Звиняй, но я пишу на С++, потому в моём коде ты таких диких конструкций не увидишь.
У меня их как раз меньше... Код библиотеки никто не смотрит... Главное синтаксис для пользователя. А тебе придется смирится с этим синтаксисом:
Я знаю, оверхэд из-за виртуального наследования... щас добавлю пять строк на все конструкторы и никакого оверхэда совсем. Зато пользователь радуется, в отличие от твоего
PC>boost::tuples сделает твой пример по переносимости так что про это даже не вспоминай. Какие идеи? В компил-тайм длину посчитать или перевернуть список типов?
Ээээ. Что там про переносимость?
Попробовал я твой пример сановским компайлером скомпилять.
Фик, однако.
Так что, не надо про переносимость, плиз.
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, Pavel Chikulaev, Вы писали:
C>>Ты видимо не в курсе про boost::fusion K>а что это такое ?
Это наследник boost::tuple позволяет делать с кортежами ужас что компил-тайм операции, ран-тайм операции...
До сих пор не в бусте официально, хотя лежит в 1.32
/boost/spirit/phoenix/ — тут либа
/libs/spirit/phoenix/ — тут примеры
Насколько я знаю Joel de Guzman сейчас работает над второй версией, а потом уж будет ревью, и официальное включение в буст
Здравствуйте, eao197, Вы писали:
E>А вот с этого места, если можно, поподробнее. E>Ты вообще PDU хочешь представлять такими кортежами? Т.е. типа submit_sm, deliver_sm и т.д.? E>Или речь идет об optional TLV? Но ведь в одном только submit_sm этих TLV штук сорок (в smpp 5.0 я насчитал 44).
Да вообще. Для не TLV полей такой кортеж явно задаёт порядок полей а дополнительная информация (когда она нужна) может быть задана трейтсами. Тоже и для опциональных TLV полей, но для них ещё может присутствовать информация о наличии/отстутсвии значения. Причём всё это практически в автоматическом режими. В принципе часть такого предстваления может быть задана динамически расширяемой (в самой структуре поля не присутствуют, пока реально им значение не присвоено) но это уже к самой идее отношения тоже не имеет.
Когда я реализовывал этот протокол (два года назад), затрахался писать кодирование/декодирование... макросы конечно помогли, но не что бы очень. Опять же надо принимать в расщёт компилеры на которых такие вещи пишутся. В моём случае это был Sun C++.
Здравствуйте, e-Xecutor, Вы писали:
PC>>boost::tuples сделает твой пример по переносимости так что про это даже не вспоминай. Какие идеи? В компил-тайм длину посчитать или перевернуть список типов?
EX>Ээээ. Что там про переносимость?
Переносимость про буст. EX>Попробовал я твой пример сановским компайлером скомпилять.
А ты мой код пытался с компилить. Он таким свойством не обладает Возможно пока.
Компилятор не ахти
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>Код библиотеки никто не смотрит... Главное синтаксис для пользователя.
Хм, аргумент убийственной силы... до первого краша. ИМХО, не стит забывать что даже если ты пишешь на BOOST++ проблемы С++ никто не отменял. А копаться в макаронах из каталога boost... таких денег никто не платит разве что только из большой любви к искуству.
Здравствуйте, Alexey Chen, Вы писали:
AC>Здравствуйте, eao197, Вы писали:
E>>А вот с этого места, если можно, поподробнее. E>>Ты вообще PDU хочешь представлять такими кортежами? Т.е. типа submit_sm, deliver_sm и т.д.? E>>Или речь идет об optional TLV? Но ведь в одном только submit_sm этих TLV штук сорок (в smpp 5.0 я насчитал 44).
AC>Да вообще. Для не TLV полей такой кортеж явно задаёт порядок полей а дополнительная информация (когда она нужна) может быть задана трейтсами. Тоже и для опциональных TLV полей, но для них ещё может присутствовать информация о наличии/отстутсвии значения. Причём всё это практически в автоматическом режими. В принципе часть такого предстваления может быть задана динамически расширяемой (в самой структуре поля не присутствуют, пока реально им значение не присвоено) но это уже к самой идее отношения тоже не имеет.
Мудрено как-то все. Я для хранения TLV использую обычный std::map.
AC>Когда я реализовывал этот протокол (два года назад), затрахался писать кодирование/декодирование... макросы конечно помогли, но не что бы очень.
Опять же странно. Там все достаточно просто делается (имхо, конечно). Вот, например:
Здравствуйте, Alexey Chen, Вы писали:
AC>Здравствуйте, Pavel Chikulaev, Вы писали:
PC>>Код библиотеки никто не смотрит... Главное синтаксис для пользователя. AC>Хм, аргумент убийственной силы... до первого краша. ИМХО, не стит забывать что даже если ты пишешь на BOOST++ проблемы С++ никто не отменял. А копаться в макаронах из каталога boost... таких денег никто не платит разве что только из большой любви к искуству.
Лично у меня таких проблем нет, но для этого есть STLFilt, но...
В принципе я согласен искать возможно будешь долго(это полезно кстати), т.к. нереализована отображение ошибок, как показывал Александреску, это бы очень пригодилось. Но обычно через некоторое время использования библиотеки ошибки находятся очень быстро и лазить туда не нужно становится..
Здравствуйте, eao197, Вы писали:
E>Мудрено как-то все. Я для хранения TLV использую обычный std::map.
Хум-хоу Только не забудь про тормаза на хипе. В моём случае это был многопоточный сервер на мнгопроцессорной машине.
AC>>Когда я реализовывал этот протокол (два года назад), затрахался писать кодирование/декодирование... макросы конечно помогли, но не что бы очень. E>Опять же странно. Там все достаточно просто делается (имхо, конечно). Вот, например: E>
E> buf << m_service_type
E> // Формируем PDU.
E>
E>И нет проблем.
Действительно нет, надо только как-то различать два вида строк, разный размер полей и хитрые поля, например error_info. И это можно делать по-разному. При этом код, который пишет твою мапу, ещё должен иметь таблицу соответствия ключей и информации о теге и кодировании значения. Очень важным является вопрос где эта информация хранится и как ты добиваешся целостности.
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>У тебя прям какая-то бусто фобия
Да не, просто прикольно. Каждый раз когда начинается обсуждения какой-либо идеи, кода, задачи на C++, обязательно кто-то будет доказывать что всё уже изобрели. Надо только взять буст, подкрутить, смазать, доработать напильником, два раза перевернуться через голову и сазать хоп. И получится тоже саме, но в разы лучше, а на мелкие мелочи ... чё на них внимание обращать, зато буст!
Не, правда. Сделайте форум BOOST++ и резвитесь там в своё удовольствие, но ИМХО, C++ и буст отнюдь не синонимы.
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, Pavel Chikulaev, Вы писали:
PC>>У тебя прям какая-то бусто фобия
K>А у тебя прям бусто мания! Честное слово!
1. На моей платформе и компиляторе буст замечательно работает (VC7.1). От чего ж мне его не использовать?
2. А ты к David Abrahams с такими заявлениями не обращался?
3. Буст лично мне много нерв и часов сэкономил, за что спасибо. Без велосипедов обошелся, некоторых.
4. А то что я в курсе всех дел? Ну и что, я ж не знаю какие ты новости отслеживаешь, мне это интересно.
5. Ну в этом форуме почти все извращенцы — до такой степени изучать С++ , но ведь об этом никто не говорит, это нормально, а буст уже лишко. так?
Здравствуйте, Alexey Chen, Вы писали:
AC>Здравствуйте, eao197, Вы писали:
E>>Мудрено как-то все. Я для хранения TLV использую обычный std::map. AC>Хум-хоу Только не забудь про тормаза на хипе. В моём случае это был многопоточный сервер на мнгопроцессорной машине.
В моем случае многопоточный сервер на однопроцессорной (пока) машине
По сравнению с затратами на логирование входящих/исходящих PDU затраты на хранение TLV-полей в хипе можно не считать. Кроме того, если это станет узким местом, то для этого мапа можно свой аллокатор приделать.
AC>>>Когда я реализовывал этот протокол (два года назад), затрахался писать кодирование/декодирование... макросы конечно помогли, но не что бы очень. E>>Опять же странно. Там все достаточно просто делается (имхо, конечно). Вот, например: E>>
E>>И нет проблем. AC>Действительно нет, надо только как-то различать два вида строк,
нет проблем:
class SMPP_PDU_1_TYPE c_string_t
: public std::string
, public smpp_serializable_t
{
...
};
//! Извлечение объекта из потока.inline oess_1::io::istream_t &
operator>>( oess_1::io::istream_t & from, c_string_t & o )
{
o.read_from( from );
return from;
}
//! Помещение объекта в поток.inline oess_1::io::ostream_t &
operator<<( oess_1::io::ostream_t & to,
const c_string_t & o )
{
o.write_to( to );
return to;
}
template< class Length_type >
class octet_string_t
: public std::string
, public smpp_serializable_t
{
...
};
//! Извлечение объекта из потока.template< class Length_type >
inline oess_1::io::istream_t &
operator>>( oess_1::io::istream_t & from,
octet_string_t< Length_type > & o )
{
o.read_from( from );
return from;
}
//! Помещение объекта в поток.template< class Length_type >
inline oess_1::io::ostream_t &
operator<<( oess_1::io::ostream_t & to,
const octet_string_t< Length_type > & o )
{
o.write_to( to );
return to;
}
AC>И это можно делать по-разному.
Конечно. Просто я удивлен, что ты выбрал достаточно хитрый способ.
AC>При этом код, который пишет твою мапу, ещё должен иметь таблицу соответствия ключей и информации о теге и кодировании значения. Очень важным является вопрос где эта информация хранится и как ты добиваешся целостности.
Да с этим так же проблем нет. И целостность я не нарушаю
Хотя пока из TLV беру только то, что нужно. Все TLV не разбираю, а храню в мапе в бинарном виде.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>Я знаю, оверхэд из-за виртуального наследования... щас добавлю пять строк на все конструкторы и никакого оверхэда совсем. Зато пользователь радуется, в отличие от твоего
Все оверхэда нет, щас как плайн-структура
Здравствуйте, eao197, Вы писали: AC>>И это можно делать по-разному. E>Конечно. Просто я удивлен, что ты выбрал достаточно хитрый способ.
Ну эту идею я придумал... по числу топика можно посмотреть, SMPP реализовывал, два года назад. И примерно так как ты показал. Плюс/минус погрешность. И мне не понравилось. Если бы сейчас стал делать, попробывал бы именно то что предложил. Но как я уже сказал с самого начала, это только голая идея. Вариантные протоколы с представлением для пользователя пакета как структуры — это возможное применение. Опять же, не значит, что надо брость всё и именно так делать. Это просто идея. Так что не надо напрягаться и искать в ней скрытый или великий смысл.
Здравствуйте, Alexey Chen, Вы писали:
AC>Здравствуйте, eao197, Вы писали: AC>>>И это можно делать по-разному. E>>Конечно. Просто я удивлен, что ты выбрал достаточно хитрый способ. AC>Ну эту идею я придумал... по числу топика можно посмотреть, SMPP реализовывал, два года назад. И примерно так как ты показал. Плюс/минус погрешность. И мне не понравилось. Если бы сейчас стал делать, попробывал бы именно то что предложил. Но как я уже сказал с самого начала, это только голая идея. Вариантные протоколы с представлением для пользователя пакета как структуры — это возможное применение. Опять же, не значит, что надо брость всё и именно так делать. Это просто идея. Так что не надо напрягаться и искать в ней скрытый или великий смысл.
Алексей, так ведь я просто из того, чтобы чужой ошибки не повторить. Если тебе реализация SMPP в лоб не понравилась, то может и я на те же грабли со временем наступлю. А вот этого хотелось бы избежать.
Так что я без всяких наездов, просто опыт перенять.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, Alexey Chen, Вы писали:
AC>>ИМХО, C++ и буст отнюдь не синонимы. E>Пока.
Если в С++ ещё и буст втащить, то точно языку трындец будет.
Надеюсь что никогда такого не будут, за исключением реализации пары классов, которые к бусту имеют весьма посредственное отношение. Ну пользует он что-то похожее.
Тот же BOOST++, на котором ув. апологет написал свой пример, к С++ вообще имеет слабое отношение. ИМХО, конечно Это другой язык, со своим синтаксисом и семантикой. На мой взгляд, до ужаса кривой и неудобный.
Re[10]: Aka Tuple
От:
Аноним
Дата:
27.06.05 11:12
Оценка:
Здравствуйте, Pavel Chikulaev, Вы писали:
K>>А у тебя прям бусто мания! Честное слово!
PC>2. А ты к David Abrahams с такими заявлениями не обращался?
Сегодня вечером обращусь.
PC>3. Буст лично мне много нерв и часов сэкономил, за что спасибо. Без велосипедов обошелся, некоторых.
Это да.
Другой вопрос что часто не от тебя зависит выбор инструментов. Ну это уже тоже тыщу раз обсуждалось
PC>4. А то что я в курсе всех дел? Ну и что, я ж не знаю какие ты новости отслеживаешь, мне это интересно.
Я тоже люблю в минуты одиночества поизучать код boost.
Вообще у меня отношение к нему как к учебнику.
PC>Млин ну от тебя-то не ожидал
Да я на самом деле агент под прикрытием, работаю на тайную ассоциацию "Велосипедостроителей".
Вхожу в доверие бустоманам и переманиваю их на нашу сторону Но ты крепкий орешек оказался...
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Pavel Chikulaev, Вы писали:
K>>>А у тебя прям бусто мания! Честное слово!
PC>>2. А ты к David Abrahams с такими заявлениями не обращался? А>Сегодня вечером обращусь.
Здравствуйте, Alexey Chen, Вы писали:
AC>Тот же BOOST++, на котором ув. апологет написал свой пример, к С++ вообще имеет слабое отношение. ИМХО, конечно Это другой язык, со своим синтаксисом и семантикой. На мой взгляд, до ужаса кривой и неудобный.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Аноним, Вы писали:
PC>>2. А ты к David Abrahams с такими заявлениями не обращался? А>Сегодня вечером обращусь.
А толку?
PC>>3. Буст лично мне много нерв и часов сэкономил, за что спасибо. Без велосипедов обошелся, некоторых. А>Это да. А>Другой вопрос что часто не от тебя зависит выбор инструментов. Ну это уже тоже тыщу раз обсуждалось
Мне посчастиливилось у меня все работает, и отказываться из дурацких non-compliant компиляторов не собираюсь, будущее компании я знаю, так что у разбитого корыта не останусь...
PC>>4. А то что я в курсе всех дел? Ну и что, я ж не знаю какие ты новости отслеживаешь, мне это интересно. А>Я тоже люблю в минуты одиночества поизучать код boost.
Да не изучаю я код буст Я и так знаю как там примерно написано, седня первый раз за несколько недель заглянул, boost::mpl::na искал, забыл как называется
А>Вообще у меня отношение к нему как к учебнику.
Я его использую в промышленном коде и радуюсь, что еще время сэкономил
Здравствуйте, Alexey Chen, Вы писали:
AC>Здравствуйте, eao197, Вы писали:
E>>Здравствуйте, Alexey Chen, Вы писали:
AC>>>ИМХО, C++ и буст отнюдь не синонимы. E>>Пока. AC>Если в С++ ещё и буст втащить, то точно языку трындец будет.
AC>Надеюсь что никогда такого не будут, за исключением реализации пары классов, которые к бусту имеют весьма посредственное отношение. Ну пользует он что-то похожее.
Тот же BOOST++, на котором ув. апологет написал свой пример, к С++ вообще имеет слабое отношение. ИМХО, конечно Это другой язык, со своим синтаксисом и семантикой.
Сравни:
class name_t {};
class value_t {};
class weight_t {};
void foo()
{
tagged_tuple<std::string, name_t, int, value_t> s;
s.get<name_t>() = "Hello World";
s.get<value_t>() = 2005;
}
Здравствуйте, eao197, Вы писали:
E>Так что я без всяких наездов, просто опыт перенять.
Основные проблемы были с опечатками и неудобством использования специальных типов, например ос_string. Плюс дублирование работы при написании логировнани я и валидации.
Собственно суть идеи, задание _языкового_ идентификатора, по которому можно удобно идентифицировать элемет структуры данных. Но не только его, а так же некую сопутствующую информацию определённую декларативно в виде трейтсов. Это может быть полезно для задания ограничений валидации, правил сериализации и логирования. Может ещё чего-то... Не знаю. А может быть это вообще плохая неинтересная и вообще вредная идея. Это всё зависит
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>Еще вопросы есть? Тут еще надо посморить о красоте
Ээээ. Есть. Вы о чем уважаемый?
AC>>На мой взгляд, до ужаса кривой и неудобный. PC>У тебя просто Visual Assist X нет
Есть. Но такие простые примеры я обычно в фаре пишу. Впрочем, я вообще часто в фаре пишу и каких либо неудобств при этом не испытываю.
Здравствуйте, Alexey Chen, Вы писали:
AC>Здравствуйте, Pavel Chikulaev, Вы писали:
PC>>Еще вопросы есть? Тут еще надо посморить о красоте AC>Ээээ. Есть. Вы о чем уважаемый?
Эт у меня коряво? По-моему у тебя этого больше, плюс у меня повторное использование, проверка от ошибок, удобный синтаксис, а что у тебя?
AC>>>На мой взгляд, до ужаса кривой и неудобный. PC>>У тебя просто Visual Assist X нет AC>Есть. Но такие простые примеры я обычно в фаре пишу. Впрочем, я вообще часто в фаре пишу и каких либо неудобств при этом не испытываю.
Из Visual Assist X никуда не пойду — ни за что!!!
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>>>Еще вопросы есть? Тут еще надо посморить о красоте AC>>Ээээ. Есть. Вы о чем уважаемый? PC>Эт у меня коряво? По-моему у тебя этого больше, плюс у меня повторное использование, проверка от ошибок, удобный синтаксис, а что у тебя?
У меня код. Ладно, ты победил, у тебя длинее.
Давай я тебе лучше отрывок из Вини-Пуха зачитаю?
— Да Кролик он умный
— Кролик — он Хитрый
— У него настояще мозги.
— Да, у него Настоящие Мозги
— И по этому он ничего не понимает.
[]
> ME> Практическая применимость такого кортежа в шаблонном коде близка к абсолютному нулю. Ничего не стоит в compile time определить количество членов boost::tuple и проитерироваться по его членам, так как индексом его членов является целое, результаты арифметических операций над которым вычисляются в compile time. По приведенному кортежу невозможно проитерироваться в generic коде, так как нужно знать имена членов. Возвращемся к тому, что индексы должны быть простыми целыми. > > Бред. Или я чего то не понимаю, или это типичный симптом пользователя буста(судя по количеству согласившихся). В данном случае можно спокойно обращаться к членам структуры по индексу, выяснять их количество, итерироваться в compile time. Я потратил ровно две минуты, чтобы написать такой код:
Действительно, именно итерироваться — элементарно. Я был не точен, random access к членам из generic кода невозможен, только перебор.
Здравствуйте, MaximE, Вы писали:
ME>Действительно, именно итерироваться — элементарно. Я был не точен, random access к членам из generic кода невозможен, только перебор.
Нда. То есть в принципе невозможен, ну хоть ты тресни
...
template < class _Tx, class _Name, class _Super = Fake_Struct >
struct Struct : _Super
{
typedef _Super _Next;
typedef _Tx _Type;
...
Только обьясните мне, непонятливому, как человек знающий (?) С++ и разбирающийся в бусте (?) может на автомате не понять как это сделать. И как опытный программист не понять почему нет смысла писать это в исходном топике?
Alexey Chen wrote:
> ME>Действительно, именно итерироваться — элементарно. Я был не точен, random access к членам из generic кода невозможен, только перебор. > > Нда. То есть в принципе невозможен, ну хоть ты тресни
AC>При этом код, который пишет твою мапу, ещё должен иметь таблицу соответствия ключей и информации о теге и кодировании значения. Очень важным является вопрос где эта информация хранится и как ты добиваешся целостности.
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>Здравствуйте, korzhik, Вы писали:
K>>Здравствуйте, Pavel Chikulaev, Вы писали:
PC>>>У тебя прям какая-то бусто фобия :)))
K>>А у тебя прям бусто мания! Честное слово! :) PC>1. На моей платформе и компиляторе буст замечательно работает (VC7.1). От чего ж мне его не использовать?
Это ты, батенька, закушался просто :)
Вот воинственный Алексей сидит на безнадежном сановском компилере, посмотри при случае regression буста на нем.
И я на том же долбаном сане сижу, уже упарился на баги этого убогого компилятора натыкаться, а ведь совершенно на ровном месте баги вылезают :(
Так что, мы, конечно, рады за тебя, но нам ничего из буста, кроме препроцессора, не светит :(
Здравствуйте, jazzer, Вы писали:
J>Это ты, батенька, закушался просто
+1
J>Вот воинственный Алексей сидит на безнадежном сановском компилере, посмотри при случае regression буста на нем.
Ну вот в воинственных записали. Интересно светлых или тёмных?
Я просто общительный и весёлый (в меру упитанный и в самом рассвете сил), только шутки у меня все из шестой палаты