Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#18+
Стоит задача сложить шаблоны в контейнер и затем их извлекать по индексу. Есть вот такой условный код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. он не работает по понятным причинам, но как сделать, чтобы работал? Если никак, как можно добиться аналогичного поведения с помощью шаблонов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2014, 16:34 |
|
||
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#18+
и затем их извлекать по индексу. извлекать, чтобы вызвать нужную специализацию Creater::make(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2014, 16:35 |
|
||
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#18+
Для One и Two нужно завести базовый класс и добавлять через указатель на него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2014, 16:58 |
|
||
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#18+
On 07.08.2014 17:34, Poppler wrote: > Стоит задача сложить шаблоны в контейнер и затем их извлекать по индексу. Надо начать с того, что шаблоны нельзя никуда сложить, ни в какой контейнер. Туда даже классы нельзя сложить. Только объекты каких-то типов или классов. > Есть вот такой условный код: > > struct One { }; > struct Two { }; > > template <class T> > struct Creater > { > T* make() {return new T(); } > }; > std::vector<Creater> vec; > vec.push_back(Creator<One>()); > vec.push_back(Creator<Two>()); > он не работает по понятным причинам, но как сделать, чтобы работал? Если > никак, как можно добиться аналогичного поведения с помощью шаблонов? Для начала, так писать нельзя. Код: plaintext 1. std::vector должен параметризироваться классом или типом, а Creater -- шаблон. Нужно инстанциировать этой шаблон сначала. Код: plaintext 1. 2. Но вот Код: plaintext 1. уже НЕ ПОЛУЧИТЬСЯ, потому что Creator<One> и Creator<Two> -- два разных, ничем друг с другом не связанных класса. Как тут советовали "Для One и Two нужно завести базовый класс и добавлять через указатель на него." не получится тоже. Ещё раз, Creator<One> и Creator<Two> -- абсолютно разные классы, они никак не связаны друг с другом, и их указатели также несоотносимы. Также не поможет Creator< CommonParentOfOneAndTwo >, он также несоотносим с предыдущими инстанциациями этого шаблона. Их можно было бы запихать в vector, преобразовав в void*, но потом-то надо будет как-то reinterpret_cast-ить обратно, а на основе чего ? В данном конкретном случае лучше забыть о существовании шаблонов. реализовать всё по паттерну Abstract Factory. Или -- что вообще просто -- хранить в векторе указатели на функции, создающие объект класса. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2014, 18:55 |
|
||
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#18+
MasterZivНадо начать с того, что шаблоны нельзя никуда сложить, ни в какой контейнер. Туда даже классы нельзя сложить. Только объекты каких-то типов или классов. Раз вы такой дотошный проверьте ещё что нибудь, например орфографию и т.п. Если непонятно то уточню, так было короче написать, смысл передавался верно, товарищ выше понял, что я хотел. MasterZivДля начала, так писать нельзя. Код: plaintext 1. std::vector должен параметризироваться классом или типом, а Creater -- шаблон. Может ещё раз перечитаете моё первое сообщение где я написал, что код условный и он не работает по понятным причинам? Я ведь не спрашивал, что не правильно конкретно в этом коде, я спросил как написать правильно то, что я хочу выразив условным кодом. MasterZivуже НЕ ПОЛУЧИТЬСЯ, потому что Creator<One> и Creator<Two> -- два разных, ничем друг с другом не связанных класса. Ну надо же, а мы то и не знали... Спасибо кеп. MasterZivЕщё раз, Creator<One> и Creator<Two> -- абсолютно разные классы, они никак не связаны друг с другом, и их указатели также несоотносимы. Также не поможет Creator< CommonParentOfOneAndTwo >, он также несоотносим с предыдущими инстанциациями этого шаблона. Т.е. вы готовы поручиться, что с использованием статического полиморфизма это никак не сделать? MasterZivреализовать всё по паттерну Abstract Factory. В данном случае уже есть реализация Abstract Factory которая переписывается на шаблоны. MasterZivИли -- что вообще просто -- хранить в векторе указатели на функции, создающие объект класса. Я спрашивал не как сделать проще, реализацию как проще уже есть, я спрашивал как сделать то что я хочу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2014, 19:48 |
|
||
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#18+
Попался клон. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2014, 19:54 |
|
||
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#18+
Poppler он не работает по понятным причинам, но как сделать, чтобы работал? Если никак, как можно добиться аналогичного поведения с помощью шаблонов? Ближайшее чего можно сделать в реальности с помощью шаблонов это использовать Boost.variant. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2014, 07:45 |
|
||
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#18+
Духовные скрепы Т.е. вы готовы поручиться, что с использованием статического полиморфизма это никак не сделать? Очень похоже на то. По крайней мере я лично не знаю способ, как это сделать. А это 80-90% надёжности. Но есть одно но -- я не очень люблю шаблоны, если можно так сказать. Они плохо сочетаются со всеми другими технологиями программирования, доступными в С++. Я их использую там, и только там, где их использование очевидно принесёт какие-то положительные плоды, но не более. Ну и главное -- как ты это запихаешь всё в фабрику, там-то статический полиморфизм не работает... Духовные скрепыMasterZivреализовать всё по паттерну Abstract Factory. В данном случае уже есть реализация Abstract Factory которая переписывается на шаблоны. А в чём цель? Просто применить шаблоны ? Как бы Abstract Factory нельзя полностью без потери функционала переписать на шаблоны, она ориентируется на полиморфизм в runtime, а шаблонный полиморфизм -- только compile time. Ты должен будешь потерять какой-то функциональ, что, возможно, допустимо в каком-то конкретном случае использования. Духовные скрепыЯ спрашивал не как сделать проще, реализацию как проще уже есть, я спрашивал как сделать то что я хочу. Возможно, я (и другие читатели) не очень хорошо представляю, что ты хочешь. Может быть тебе стоит объяснить это более детально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2014, 13:08 |
|
||
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#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. 41. 42. 43. 44. 45. 46. 47. только хотелось, чтобы не было отдельных шаблоных функций, а был шаблонный класс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2014, 14:40 |
|
||
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#18+
fixed Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2014, 14:45 |
|
||
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#18+
Духовные скрепыЕсли кратко я хотел, что-то типа этого: Код: plaintext 1. 2. Лучше бы ты словами написал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2014, 14:46 |
|
||
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#18+
MasterZivЛучше бы ты словами написал... Словами, нужно сложить типы в контейнер и извлекать нужный тип для создания объекта. Только хотелось бы вместо шаблонных функций заюзать шаблонный класс(ы). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2014, 14:48 |
|
||
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#18+
On 08.08.2014 15:48, Духовные скрепы wrote: > Словами, нужно сложить типы в контейнер и извлекать нужный тип для > создания объекта. Это метаклассы надо делать, и их хранить. При чём язык С++ метаклассы никак не поддерживает, и тебе придётся метакласс отдельно РУКАМИ (ну или с помощью магии макросов) описывать, параллельно с основными классами, и С++ тебе в этом никак не поможет. Только хотелось бы вместо шаблонных функций заюзать > шаблонный класс(ы). Ну и при чём тут шаблоны ? Вообще ни при как. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2014, 17:06 |
|
||
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#18+
Это задачка детская. Но в С++ почему-то все хотят "птичьего молока" вместе с ее решением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2014, 17:43 |
|
||
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2014, 09:36 |
|
||
|
Шаблоны в контейнере
|
|||
|---|---|---|---|
|
#18+
Вероятно, топикстартеру курить до просветления: http://video.ch9.ms/ch9/7469/5deda136-d074-445d-8ac8-8a6983507469/GN13SeanParentInheritanceistheBaseClassofEvil_high.mp4 int main() { document_t document; document.emplace_back(0); document.emplace_back(string("Hello!")); document.emplace_back(document); document.emplace_back(my_class_t()); draw(document, cout, 0); } Если здесь танец вокруг draw, то у него будет вокруг собственного make. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2014, 23:10 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38716665&tid=2019342]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 165ms |

| 0 / 0 |
