![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
есть необходимость, в качестве ID`а для получения некоторого объекта, использовать строку. сейчас этот способ работает в run-time, и работает не плохо. но это делает невозможным статическую проверку соответствия типов, по понятным причинам.
гуглением, нашел алгоритм создания хеш-суммы строки в compile-time: http://arcticinteractive.com/2009/04/18/co...hing-boost-mpl/ это кажется идеальное решение моей задачи, за исключением того, что строка необходимая алгоритму, должна разбиваться на части по 4 символа, или посимвольно, так же, по понятным причинам. т.е., вместо привычной теперешней записи ID`ов, придется писать так:
что абсолютно не юзабельно ![]() вопрос в том, как строку типа "object.method", корректно передать в этот алгоритм? всем спасибо. зы
http://liveworkspace.org/code/b3380d0e18eb...22710478202c062 Это сообщение отредактировал(а) boostcoder - 14.2.2011, 22:25 |
||||
|
|||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
наверное, правильнее не подстраиваться под имеющуюся реализацию, а написать подходящую, не использующую boost::mpl::string.
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
как правильно написано в конце этой статьи, надо ждать constexpr которое уже есть в гцц 4.6 . также есть вот такой вариант http://2x2is11.blogspot.com/2010/11/c-how-...ng-hash-at.html хотя полученные им хеши не константы времени компиляции, фактически они получаются во время компиляции, может это можно как-то использовать. |
|||
|
||||
boostcoder |
|
||||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
спасибо. я тоже нагуглил что-то подобное: http://chrissavoie.com/articles-mainmenu-29/15/14-hashing но в обоих случаях, при таком примере:
получаю одинаковые ошибки:
и еще. при тестах: http://arcticinteractive.com/2009/04/18/co...hing-boost-mpl/ обнаружил странные результаты. в следующем коде, последние пять результатов - разные. я полагал, что при записи подряд более 4ех символов, последние будут игнорировать. а получается что нет. кто-то может объяснить такое поведение?
http://liveworkspace.org/code/6d3cdaf592c7...d84591ef10fa51d Это сообщение отредактировал(а) boostcoder - 13.2.2011, 06:25 |
||||||||
|
|||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
упс, запутался ![]() Добавлено через 2 минуты и 38 секунд да. все верно. у этих строк значения одинаковые:
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
можно избавиться от ' ', но к сожалению запятая останется... т.е. строка будет задаваться как STR(a,b,c,d,e,f,g) при этом будет возможность задать свой алфавит символов... т.е. например запятую можно будет обозвать как comma.. для этого 1. для каждого символа создается свой тип 2. чтоб не было коллизий, имени типа символа задать общий уникальный префикс 3. определить макрос, который из переданной последовательности символов, создаст последовательность типов.. Добавлено через 9 минут и 58 секунд вот пример: http://forum.vingrad.ru/forum/topic-268064...1931740/13.html избавиться от _3 в LIST_OF_CHARS_3 тоже можно посредством эллипсиса.. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
я тут всерьез подумываю о pre-build-step`е на котором, некоторая утилитка, из вызовов типа ".registry(&t, "type")" и ".on("method", &type::method)", создаст записи типа ".registry(&t, 0xf363e2)" и ".on(0x552a6b3, &type::method)" соответственно. или, привязать пользователей к gcc-4.6 ![]() ну не вижу я другого решения... |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
это естественно менятся на что то типа : struct char_a { enum { value = 'a'}; }; |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
но ни один из вариантов хорошим не назовешь, ибо оба через одно место...
по переписке разработчиков выяснил, что ориентировочная дата выхода релиза - осень этого года ![]() в репозитариях его нет. т.е. остается либо собирать самому, либо искать чьи-то сборки. Добавлено через 28 секунд
да. я понял. |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
для этого для начала нужно представлять концепцию.. а вариантов куча, вот например еще один :
|
||||
|
|||||
boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
этого очень не хочется... ![]()
этого сейчас тоже нет. выглядит так:
для каждого обработчика требуется объект регистратор, время жизни которого, определяет время действительности регистрации. но сейчас нет статической проверки типов. потому и вожусь... хотя работает. может забить на проверку типов... реализовать когда gcc-4.6 выйдет.. Это сообщение отредактировал(а) boostcoder - 13.2.2011, 15:01 |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
для того чтоб была статическая проверка, надо будет все равно определить тип... тем более что, тип используется минимум в двух (при отправке и приеме).. вот что к примеру мешает сейчас добавить макрос, для такого использования :
? |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вопрос был в принципе не о макросе.. а о третьей точке - о точке определения нового типа.. Как по Вашему, она должна быть или Вы ее специально избегаете ? Добавлено через 14 минут и 8 секунд макросы, в принципе, можно реализовать так, чтоб их присутствие не было в хидерах пользователя.. Это сообщение отредактировал(а) mes - 13.2.2011, 16:47 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
например отделить рантайм представление ид от типа ...
http://liveworkspace.org/code/ac0bac3f7199...a8cefe173170975 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
отвечу в нашей мегатеме.
а то к этой теме это отношения уже не имеет... |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вы не могли бы показать пример этого? я что-то не въезжаю ![]() |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
boostcoder, просто помечаете функцию как constexpr и она работает в compile-time
http://www.open-std.org/jtc1/sc22/wg21/doc.../2007/n2235.pdf (на самом деле есть ограничения, впрочем всеравно надо ждать гцц4.6 чтобы проверить) Это сообщение отредактировал(а) GoldFinch - 14.2.2011, 00:51 |
|||
|
||||
boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
про constexpr я понял. я не помял что мне это даст.
как constexpr мне поможет использовать алгоритм mpl-hash в данном случае? Добавлено через 1 минуту и 55 секунд я могу проверить и сейчас. знать бы что проверять. |
||||
|
|||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
сомнительное это дело, писать код вслепую %)
Добавлено через 5 минут и 4 секунды вобщем циклов там нет, рекурсии нет. зато там наверное можно сделать
если да - то это можно использовать в том макросе для хешей Добавлено через 6 минут и 5 секунд работу со строковыми литералами надо проверять, что еще %) |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
mes, потому что Струструп так сказал
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну вот это для начала :
Это сообщение отредактировал(а) mes - 14.2.2011, 01:14 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вы о том, что у вас нет gcc-4.6 ? пожалуйста: rghost.ru/4342609 вчерашняя сборка из SVN. Это сообщение отредактировал(а) boostcoder - 14.2.2011, 01:15 |
|||
|
||||
GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
boostcoder, при проверках надо учитывать что constexpr код может быть и динамически выполняемым:
массивы могут не подойти, т.к. может сработать расширение С99 лучше шаблоны или switch
|
||||
|
|||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
mes, сейчас проверю.
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
||||
|
||||
boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
забыл уточнить: это mingw. Добавлено через 4 минуты и 45 секунд mes, ваш код скомпилился только после такой поправки:
результат - 28. правильно. иначе такая ошибка:
|
||||
|
|||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
работает Это сообщение отредактировал(а) GoldFinch - 14.2.2011, 01:30 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
значит я правильно понял что mes имел ввиду. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
спс ![]() а ну да.. но для первого раза пойдет.. ну как терь сделать hash функцию нашли ? |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
ну вот, осталось хеш сделать....
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
есть идеи. буду пробовать ![]() угу. и привязать пользователей к будущему стандарту ![]() Это сообщение отредактировал(а) boostcoder - 14.2.2011, 01:34 |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
время позднее, ничего умнее макроса который будет раскрываться в копипасту мне на ум не приходит.
Добавлено через 2 минуты и 53 секунды хотя есть вариант передавать строку как значение... |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
тут два вопроса возникают.. 1. до сих пор не вижу как защитит типизацию Вас компил-тайм хэш.. 2. что мешает, для остальных компилятор использовать более неудобное представление ? |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
слава копипасте... Добавлено через 4 минуты и 5 секунд для меня он уже настоящий (правда в пределах MSVC2010 =\ ) Это сообщение отредактировал(а) GoldFinch - 14.2.2011, 01:52 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
GoldFinch, а есть идеи, как избавиться от макроса?
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
нормальных - пока нету
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
хватит на сегодня. спать. всем спасибо и сн.
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
просто считайте что его там нет.
(наверное это самое эффективное решение) |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
GoldFinch, а в микрософтстудии constexpr реализован?
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
boostcoder, неа, там вообще мало что реализовано,
лямбды, auto, decltype, r-value references |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
этот код работает ? тогда можно используя рекурсию шаблонов, создать хэш-итератор.. ![]() Это сообщение отредактировал(а) mes - 14.2.2011, 02:55 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
да ![]() можно подробнее? ;) Добавлено через 1 минуту и 18 секунд расширил возможность использовать до 64ех символов. вроде длинее быть не должно ![]()
Добавлено через 12 минут забыл сказать, результат - 720 Добавлено через 12 минут и 59 секунд в смысле, чтоб избавиться от баяна чаров? вариант. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот примерно:
допиливайте ![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
нельзя ли прокомментировать, откуда взялось 130 ?! ![]() Добавлено через 1 минуту и 13 секунд а кто такой "баян" в данном контексте ? |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
не уверен, но полагаю, что это из-за нулевого символа добавляемого в конец хешируемой строки, и того = 129. или что? вот. ну чем не баян? ;) |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
все дошло.. я "баян" забыл посчитать.. ![]() Добавлено через 1 минуту и 7 секунд а пример тремя постами выше с шаблонной рекурсией подошел ? или еще не пробовали ? |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
завтра буду пробовать. сегодня повод, как ни как ![]() Добавлено через 11 минут и 55 секунд вот. проверил. ничего не пришлось допиливать ![]()
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
кстати да, FNV1-a не лучший хеш для этой задачи, надо бы поискать что получше
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
гугл меня вчера завел на какой-то сайт, и там была куча его разновидностей, и букв. потому не осилил ![]() Добавлено через 5 минут и 58 секунд тему переименовал. не теряйтесь ![]() |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
нда.. похоже что кроме как генерацией кучи шаблонов, циклов для constexpr не получить.
насчет хеширования строк: http://bretm.home.comcast.net/~bretm/hash/7.html - если верить этой статье, Bob Jenkins' hash достаточно хорош для строк (а crc32 очень плох) надо будет попробовать реализовать его для constexpr. код: http://burtleburtle.net/bob/c/lookup3.c |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
также надо бы подумать о надежном применении хешей для switch
как минимум надо чтобы небыло коллизий между хешами меток в одном switch'e можно также потребовать чтобы коллизий не было во всей единице трансляции, это слишком строгое требование, но возможно его проще реализовать |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну switch, насколько я знаю, просто напросто не нужен.. а для проверки коллизий, можно использовать карту соответствий, которая так и так составляется.. исхожу из ранее приведенных boostcoder`ом данных. ![]() |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
хм.. действительно
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |