Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Возможно ли сделать фабрику которуя я на этапе компиляции забиваю типами, потом когда программа выполняется создать этот тип допустим по строке, по енуму неважно, но чтоб не возращать void* а конкретный тип.Вот код который у меня сейчас получился: Код: 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. пожалуйста не предлагайте вариант с полиморфизмом. Вообще классы ABC в идеале должны использовать статичекий полиморфизм(crtp pattern) но чтоб фабрика возратила base<type> find_and_create().Может возможен вызов функции из void * чтото вроде ret->&A::foo но это не валидный код.Какие есть варинаты решение такой задачи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2013, 11:07 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Katamaran1987Возможно ли сделать фабрику которуя я на этапе компиляции забиваю типами, потом когда программа выполняется создать этот тип допустим по строке, по енуму неважно, но чтоб не возращать void* а конкретный тип. ... пожалуйста не предлагайте вариант с полиморфизмом. В С++ - невозможно. Katamaran1987 Вообще классы ABC в идеале должны использовать статичекий полиморфизм(crtp pattern) но чтоб фабрика возратила base<type> find_and_create().Может возможен вызов функции из void * чтото вроде ret->&A::foo но это не валидный код.Какие есть варинаты решение такой задачи?Чтобы вызвать foo(), надо иметь базовый класс, в котором определен метод foo(). А вы не хотите. Тогда вам нужен язык с динамической типизацией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2013, 12:12 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
?Katamaran1987Возможно ли сделать фабрику которуя я на этапе компиляции забиваю типами, потом когда программа выполняется создать этот тип допустим по строке, по енуму неважно, но чтоб не возращать void* а конкретный тип. ... пожалуйста не предлагайте вариант с полиморфизмом. В С++ - невозможно. Почему невозможно ? Забить в методы создания конкретных типов конкретные сигнатуры (типы возврата) и всё. Можно использовать шаблоны, с помощью их нагенерировать такие "фабрики". Только это как-то уже не фабрика вовсе. Что там от фабрики остаётся? Скорее это похоже на фабричный метод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2013, 14:52 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
MasterZiv?пропущено... В С++ - невозможно. Почему невозможно ? Забить в методы создания конкретных типов конкретные сигнатуры (типы возврата) и всё. Можно использовать шаблоны, с помощью их нагенерировать такие "фабрики". Только это как-то уже не фабрика вовсе. Что там от фабрики остаётся? Скорее это похоже на фабричный метод.Я тоже об этом думал но это все надо сделать в одном методе, в котором я передаю и аргументы для создания класса и сигнатуры функций которые надо вызвать, да еще их параметры сума сойдешь потом это сопровождать, да и разгребсти что для чего.И сразу как создал надо будет удалять, а тут еще и пул созданных обектов нужен, тяжелый вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2013, 15:34 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
MasterZivЗабить в методы создания конкретных типов конкретные сигнатуры (типы возврата) и всё. Никак не могу понять что имелось ввиду.Можно пример схематично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2013, 15:53 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Katamaran1987, Блин какие примеры? 20 методов, Создать то, возвращает то, Создать это, возвращает это, Создать хрень 23, возвращает хрень 23 И так далее. Можно это же сделать одним методом, шаблонным. Толку только 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2013, 17:44 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Легко: http://ideone.com/h64ZX3] http://ideone.com/h64ZX3 Код: 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. выводv0: i v1: f v2: d Вопрос только в том, что у вас не четко сформулирована задача. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2013, 19:34 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Легко... Это не является решением моего вопроса, еслиб мне надо был тип на этапе компиляции нафига мне такая фабрика,я сразу предаставлю тип? Код: 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. Вот намного проще и понятней, также вместе enable_if можно и нужно использовать disable_if если условие одно и тоже а нужна другая перегрузка. Проблема что тип нуже на этапе выполнения, а это не возможно получить потомучто C++ строго типизированный и выход или использовать virtual или все действия выполнять сразу как создал обьект, в тойже функции и в конце удалять обьект, или создавать целую кучу функций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 10:14 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Katamaran1987, нужно раз и навсегда понять, что так как заранее неизвестно какое значение будет передано функции в данной строке кода (в вашем случае фабричному методу), то неизбежно нужен механизм диспатчинга, какой-нибудь switch-case, hash-таблица, или любой другой, который основываясь на переданном значении сделает соответствующие этому значению действия в райнтайме. В C++ есть удобный быстрый надежный встроенный механизм для этого - виртуальные функции-члены. Поэтому или изобретайте их заново долго совершенствуя и исправляя баги, или просто используйте их . PS: Зачем в стопицотый раз заниматься безнадежным аутотренингом, что возможно есть что-то, что волшебным образом срастит рантайм с компайл-тайм? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 12:35 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
sherzod_Katamaran1987, PS: Зачем в стопицотый раз заниматься безнадежным аутотренингом, что возможно есть что-то, что волшебным образом срастит рантайм с компайл-тайм? http://cpptruths.blogspot.com/2011/07/want-speed-use-constexpr-meta.html constexpr почти сращивает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 12:38 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Katamaran1987sherzod_Katamaran1987, PS: Зачем в стопицотый раз заниматься безнадежным аутотренингом, что возможно есть что-то, что волшебным образом срастит рантайм с компайл-тайм? http://cpptruths.blogspot.com/2011/07/want-speed-use-constexpr-meta.html constexpr почти сращивает. Что означает почти? Мне известно лишь одно взаимодействие между кт и рт и это "перенос". Причем несмотря на всю монструозность метапрограммирования на С++, оно основано на очень простом принципе, если все известно на этапе компиляции, то и вычислить можно на этапе компиляции, если нет - только рантайм. И уже все равно как глубоко зарыты известные данные (в функции, выражениях, перечислениях вложенных в классы вложенных в классы и тд). Какие тут могут быть почти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 12:44 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
sherzod_... Почти что функции конст экспрешн могут вычислить значение как в рантайме так и во время компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 14:34 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Katamaran1987, задача то какая? Нормально и полно сформулируйте парой предложений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 15:18 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
задача то какая?Katamaran1987, задача то какая? Нормально и полно сформулируйте парой предложений.Все очень просто есть фабрика на этапе компиляции я забиваю ее типами, во время выполнения приходят строки которые закидываются в метод фабрики и создаются обьекты по этой строке, но сейчас я смог возратить void* от созданного обьекта а хотелось бы конкретный тип. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 15:28 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Katamaran1987Все очень просто есть фабрика на этапе компиляции я забиваю ее типами, во время выполнения приходят строки которые закидываются в метод фабрики и создаются обьекты по этой строке , но сейчас я смог возратить void* от созданного обьекта а хотелось бы конкретный тип. Чтобы был конкретный тип, он должен быть известен при компиляции, а у вас он становится известен при выполнении. Так что забудьте. Другое дело, что это в принципе проблема вашего дизайна, что одна фабрика создает объекты совершенно различных классов без общего предка из-за чего вы не можете использовать полиморфизм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 15:48 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Katamaran1987задача то какая?Katamaran1987, задача то какая? Нормально и полно сформулируйте парой предложений.Все очень просто есть фабрика на этапе компиляции я забиваю ее типами, во время выполнения приходят строки которые закидываются в метод фабрики и создаются обьекты по этой строке, но сейчас я смог возратить void* от созданного обьекта а хотелось бы конкретный тип. Все до единого типы известны уже на этапе компиляции. Вариант только полиморфизм. Т.е. конкретно в такой постановке задача не имеет решения. А вам нужно boost::any или boost::variant<> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 15:51 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyKatamaran1987Все очень просто есть фабрика на этапе компиляции я забиваю ее типами, во время выполнения приходят строки которые закидываются в метод фабрики и создаются обьекты по этой строке , но сейчас я смог возратить void* от созданного обьекта а хотелось бы конкретный тип. Чтобы был конкретный тип, он должен быть известен при компиляции, а у вас он становится известен при выполнении. Так что забудьте. Другое дело, что это в принципе проблема вашего дизайна, что одна фабрика создает объекты совершенно различных классов без общего предка из-за чего вы не можете использовать полиморфизм. Предок есть вот такие классы: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 16:30 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Katamaran1987Предок есть вот такие классы: Вы знаете что такое предок? Это тип от которого наследуются. А здесь нет наследования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 16:41 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Я беру свои слова обратно, дизайн тут не причем. Дизайна тут вообще нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 16:47 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
наследуютсяKatamaran1987Предок есть вот такие классы: Вы знаете что такое предок? Это тип от которого наследуются. А здесь нет наследования.Чушь, это CRTP патерн только я не наследую а делегирую. Код: 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. Специально для вас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 16:49 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Объясните глупому новичку, почему не Код: plaintext 1. 2. 3. 4. 5. 6. 7. Для каких целей do_foo понадобилась? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 17:02 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
InkelyadОбъясните глупому новичку, почему не Код: plaintext 1. 2. 3. 4. 5. 6. 7. Для каких целей do_foo понадобилась?Потому что я привел обычный пример, в C++ есть 2 полиморфизма один динамический а второй статический с помощью вот таких do_foo мы получаем полиморфное поведение обьектов, что заменяет virtual и не нужна никакая таблица вирт функций, ни деструкторы виртупальные, нинакладные расходы на вызов виртуальной функции, и экономия на размере класса изза указателя на таблицу. Вот сколько плюсов ребята, с виртуалом любой дурак сделает.Может моя задача в данном топике так просто не решится но паттерн достойный изучения.На нем весь ATL/WTL построен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 17:12 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Katamaran1987Потому что я привел обычный пример, в C++ есть 2 полиморфизма один динамический а второй статический с помощью вот таких do_foo мы получаем полиморфное поведение обьектов, что заменяет virtual и не нужна никакая таблица вирт функций, ни деструкторы виртупальные, нинакладные расходы на вызов виртуальной функции, и экономия на размере класса изза указателя на таблицу. Не понимаю. foo не была объявлена виртуальной же. классы А и B вообще могут независимыми классами быть. И все отлично вызовется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 17:18 |
|
||
|
Статическая фабрика обьектов
|
|||
|---|---|---|---|
|
#18+
Inkelyad...Виртуальность в данном случаи не нужна, все методы вызываются в соответсвии с типом, все связывание происходит на этапе компиляции. Код: plaintext 1. 2. это базовой класс и в do_foo я принимаю базовый класс, но так как тип известен на этапе компиляции то в функция вызовет тот метод который нужен. do_foo скорее всего будет соптимизирована компилятором,но я в итоге получил полиморфное поведение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2013, 17:23 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38191242&tid=2020359]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 280ms |
| total: | 422ms |

| 0 / 0 |
