Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
Раньше обход enum можно было делать так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Теперь в C++11 можно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Можно ли как-то делать обход без постоянных static_cast или можно ли как-то перегрузить operator int для enum class T1? Если раскоментировать перегрузку оператора, то вылетает ошибка: автор9:14: internal compiler error: in constructor_name_p, at cp/name-lookup.c:1809 Please submit a full bug report, with preprocessed source if appropriate. See < http://gcc.gnu.org/bugs.html> for instructions. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2013, 20:38 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
В принципе можно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Но как перегрузить именно глобальный оператор приведения типа size_t<->T1? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2013, 21:50 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
Все таки хорошая штука C++11, сразу видно облегчает жизнь программиста. Было так: Код: plaintext 1. Стало так: Код: plaintext 1. А можно даже так: Код: plaintext 1. 2. 3. 4. 5. Как говорится улучшение языка на лицо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2013, 22:02 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
Sheraton , естественно я привел проблемные/не понятные мне места C++11. Если бы я привел все косяки старого способа... но это уже другая тема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2013, 22:18 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
На самом деле скорее всего оба варианта кода, старый и новый, невалидны, потому что значения enum должны быть по стандарту уникальны, а не по возрастанию идти. Надо глянуть в стандарт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 00:44 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
MasterZivНа самом деле скорее всего оба варианта кода, старый и новый, невалидны, потому что значения enum должны быть по стандарту уникальны, а не по возрастанию идти. Надо глянуть в стандарт. enum не должны быть уникальны. Они по умолчанию всегда идут с нуля по возрастанию на 1. Оба варианты правильны: C++03 7.2 Enumeration declarationsThe identifiers in an enumerator-list are declared as constants, and can appear wherever constants are required. An enumerator-definition with = gives the associated enumerator the value indicated by the constant-expression. The constant-expression shall be of integral or enumeration type. If the first enumerator has no initializer, the value of the corresponding constant is zero. An enumerator-definition without an initializer gives the enumerator the value obtained by increasing the value of the previous enumerator by one. [Example: enum { a , b, c =0 }; enum { d, e, f=e+2 }; defines a, c, and d to be zero , b and e to be 1, and f to be 3. ] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 03:04 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
enum class, Отсюда вывод: Код валидный, но не смотря на его валидность - он бессмысленный и не верный. Код: plaintext 1. 2. 3. 4. И усе. Никакого обхода ты уже не сделаешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 07:45 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
White Owl, Да вообще нужно перечисление enum — сделай себе массив всех значений и всё, будет честнее. Или в вектор их. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 09:57 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
Количество способов выстрелить себе в ногу увеличилось еще на один. Записал с блокнотик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 13:47 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
maytonКоличество способов выстрелить себе в ногу увеличилось еще на один. Записал с блокнотик. Оно всегда было или только сейчас про enum узнали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 14:35 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
White Owlenum class, Отсюда вывод: Код валидный, но не смотря на его валидность - он бессмысленный и не верный. Код: plaintext 1. 2. 3. 4. И усе. Никакого обхода ты уже не сделаешь. Ну так почти любой код загадить можно. Тоже самое может быть (значения не по порядку, не уникальные и т.д.) и с массивом всех значений, или вектором, или структурой с константами или что взамен enum вы предлагаете? MasterZivWhite Owl, Да вообще нужно перечисление enum — сделай себе массив всех значений и всё, будет честнее. Или в вектор их. Честнее для тех кто не знает стандарт и может сомневаться в значениях enum. В enum есть один плюс по сравнению с массивом и вектором - проверка наличия такой константы, например func(a10) - выдаст compile-time ошибку, а func(arr[10]) - не выдаст. Помимо этого каждый элемент enum можно обозвать более выразительно, а каждый элемент массива - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 14:47 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
enum class, Плюсую. При правильном применении (как и все фичи С/С++) enum помогает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 15:45 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
enum classНу так почти любой код загадить можно. С точки зрения коня в вакууме. А с точки зрения реального мира это единственная альтернатива толпе дефайнов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 16:13 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyenum class, Плюсую. При правильном применении (как и все фичи С/С++) enum помогает. Получается для нумерации в пределах одного модуля(DLL) больше подходит enum class без перегруженных операторов, т.к. их перегрузка фактически превращает его в обычный enum. Либо ещё такие варианты. Статический массив: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Динамический массив: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. А если нужна сквозная нумерация по объектам из DLL с динамической ликновкой и поздним связыванием, то std::map со строковым или своим типом индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 17:39 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
Имеется ввиду по объектам из множества DLL с динамической ликновкой и поздним связыванием. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 17:41 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
OoCcenum classНу так почти любой код загадить можно. С точки зрения коня в вакууме. А с точки зрения реального мира это единственная альтернатива толпе дефайнов. Это: Код: plaintext 1. 2. 3. 4. тоже самое что это: Код: plaintext 1. 2. 3. 4. и тоже самое что это: Код: plaintext 1. 2. 3. 4. 5. А как бы это выглядело из дефайнов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 17:46 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
enum classпропущено...А как бы это выглядело из дефайнов? Наоборот. Например имеем флажки - набор непересекающихся битовых значений и масок для выделения их наборов. Все это сидит ввиде дефайнов.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 18:17 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
OoCcenum classпропущено...А как бы это выглядело из дефайнов? Наоборот. Например имеем флажки - набор непересекающихся битовых значений и масок для выделения их наборов. Все это сидит ввиде дефайнов.... Почему бы их не задать статическими константами структуры или вы используете для не пересекающихся битовых значений монотонное возрастание enum class? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 18:23 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
enum classпропущено... Почему бы их не задать статическими константами структуры или вы используете для не пересекающихся битовых значений монотонное возрастание enum class? Можно и так. enum появился гораздо раньше и был единственной альтернативой дефайнам. Сейчас это его легаси. Но этим пользуются и нельзя говорить что это загаживание кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 18:53 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
OoCcenum classпропущено... Почему бы их не задать статическими константами структуры или вы используете для не пересекающихся битовых значений монотонное возрастание enum class? Можно и так. enum появился гораздо раньше и был единственной альтернативой дефайнам. enum появился раньше чем struct? Код: plaintext 1. 2. 3. 4. OoCcСейчас это его легаси. Но этим пользуются и нельзя говорить что это загаживание кода. А вы про присвоение конкретных значений перечислениям. Это не является загаживанием. Загаживание это я говорил про присваивание конкретных значений тем перечислениям, которые должны использовать дефолтную нумерацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 20:09 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
Набросал упрощенный примерчик с использованием enum class внутри модулей DLL и использовании std::map в EXE для регистрации создателей объектов абстрактной фабрики. Для статического массива DLL1 при увеличении перечислений помимо изменения класса Tmy1 необходима правка списка инициализации массива, причем в строгой последовательности с enum. В DLL2 это решено раскруткой шаблонной функции. В принципе там можно было и std::vector использовать вместо std::map. Кстати, как избавиться от явного указания параметров шаблона в специализированной функции? Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 23:06 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
enum classНабросал упрощенный примерчик с использованием enum class внутри модулей DLL А при чём тут DLL ? Enum работает одинаково как в DLL , так и без них. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 02:37 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
MasterZivenum classНабросал упрощенный примерчик с использованием enum class внутри модулей DLL А при чём тут DLL ? Enum работает одинаково как в DLL , так и без них. Для примера, чтоб не в воздухе висел, а к конкретной задаче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 03:00 |
|
||
|
Обход enum class в C++11
|
|||
|---|---|---|---|
|
#18+
enum classMasterZivпропущено... А при чём тут DLL ? Enum работает одинаково как в DLL , так и без них. Для примера, чтоб не в воздухе висел, а к конкретной задаче. Ну, можно было бы там TCP-сокеты ещё приплести, для примера .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 09:59 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=86&tid=2020525]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
65ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
105ms |
get tp. blocked users: |
2ms |
| others: | 16ms |
| total: | 234ms |

| 0 / 0 |
