| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > [C++0x] функция генерация uid как constexpr |
| Автор: rudvil 29.4.2011, 15:24 | ||||||||
| Реально ли функцию std::size_t uid() сделать как constexpr, чтобы приведенный ниже код заработал? http://liveworkspace.org/code/a64a5b6a70e0fd5c7226de52e9393491
Про enum'ы знаю, их можно не предлагать. Пока что смог вот так извратиться, но все время писать эти макросы жутко не удобно http://liveworkspace.org/code/957f17038912deb402bcc6714c2fa5c8
какие могут быть решения данной проблемы? |
| Автор: rudvil 29.4.2011, 22:00 | ||||
Понятно, спасибо. |
| Автор: boostcoder 29.4.2011, 22:09 |
есть еще встроенный макрос __COUNTER__ |
| Автор: rudvil 29.4.2011, 23:55 | ||
Спасибо, кажется наилучшее решение. |
| Автор: mes 30.4.2011, 09:20 |
| у решения с COUNTER недостаток в повторении значений в разных единицах трансляции... смотря для чего нужны id, и если к значению нет требований(в том числе и динамика), кроме его уникальности, то можно использовать адресс переменной... хотя подобный подход накладывает тоже много ограничений.. и обычно применяется для идентификатора типа.. |
| Автор: boostcoder 30.4.2011, 16:12 |
если, к примеру, не нужны последовательные значения, то __COUNTER__ можно комбинировать с __LINE__ |
| Автор: mes 30.4.2011, 16:18 |
а разве это гарантирует уникальность ? Добавлено через 1 минуту и 52 секунды к тому же может привести к проблеме, когда из за добавления одной незначащий строчки, появиться неожидано непредвиденное поведение |
| Автор: boostcoder 30.4.2011, 16:21 | ||
нет, естественно Добавлено @ 16:24
это да. я когда-то пытался закодить что-то вроде этого.. мне нужен был компайл-тайм typeid. но только чтоб он не имена типов возвращал, а целые в качестве ID`ов. ну и забросил. вроде как на тот момент это мне казалось невозможным... была идея пропатчить компилятор |
| Автор: borisbn 2.5.2011, 12:54 | ||
| Прошу прощения, что спрашиваю в чужой теме, но вопрос IMHO близкий... А можно как-нибудь проверить в compile-time уникальность констант, но не через switch. Есть такой код
Если ТС будет против - создам отдельную тему. Спасибо |
| Автор: boostcoder 2.5.2011, 13:10 |
| borisbn, вроде как цели схожи: http://forum.vingrad.ru/forum/topic-319669.html Добавлено через 1 минуту и 45 секунд а вообще - нет, такое невозможно. решение влоб - добавлять твои типы в некий mpl-контейнер с проверкой на предмет существования. |
| Автор: mes 2.5.2011, 14:37 | ||
это _вдвойне_ невозможно, так как typedef не создает новый тип |
| Автор: borisbn 2.5.2011, 15:57 | ||
_вдвойне_ жаль :(
не очень понял (читай - вообще не понял), т.к. с mpl-контейнерами не работал. Можешь показать пример ? И ещё вопрос, __COUNTER__ исключительно gcc-шный, или в MSVC он тоже есть ? mes, если не такой typedef, а какая-либо другая конструкция может дать compile-time ошибку при совпадении констант ? Сейчас делаю совершенно дурацким способом - перед компиляцией сам парсю свой исохдник и проверяю константы на уникальность, но IMHO это не выход... |
| Автор: boostcoder 2.5.2011, 16:02 | ||
в MSVC тоже. чичас |
| Автор: mes 2.5.2011, 16:20 | ||
в любом случае нужен список.. получить его можно либо при определении нового типа _наследоваться_ от предыдущего и сохранять полученный список типов внутри определяемого типа, либо отдельно от определений составить список всех нужных типов.. Ну а имея список типов легко проверить на уникальность, вхождение в нужный диапазон и многое другое.. |
| Автор: borisbn 2.5.2011, 20:42 | ||||
это как GoldFinch предлагал в теме, приведённой boostcoder ?
? Я, честно говоря, не очень понимаю, как это может помочь при проверке уникальности... |
| Автор: mes 2.5.2011, 22:37 |
грубо да зная все цепочку типов, вы может пробежаться по ней и проверить на уникальность.. |
| Автор: borisbn 2.5.2011, 22:54 |
Всё равно не понимаю. Как пробежаться ? Глазами ? В run-time ? Ладно, чтоб не мучать больше, последний вопрос/просьба - не могли бы Вы привести пример кода, на который бы ругался компилятор, в случае, если в качестве инстанциатора (слово-то какое) шаблона будут повторяющиеся константы. Спасибо. |
| Автор: boostcoder 3.5.2011, 03:42 |
посмотри сюда: http://www.boost.org/doc/libs/1_46_1/libs/mpl/doc/refmanual/refmanual_toc.html там куча контейнеров и алгоритмов для работы с ними. как ты думаешь, это ран-тайм? |
| Автор: mes 3.5.2011, 08:47 | ||
ну списка типа в рантйме просто не существует, ну а если глазами, зачем его было составлять
http://www.boost.org/doc/libs/1_46_1/libs/mpl/doc/refmanual/unique.html |