Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52

Паттерны метапрограммирования шаблонов

28.08.2013, 21:49. Показов 1009. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нигде не могу найти литературу по паттернам метапрограммирования шаблонов, александреску не предлагать))
конкретно не могу понять как решить такую ситуацию
C++
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
class MTop{};
template <class Child>
class MainObject
{
public:
Child * Add(char const* param);
void SetParam(char const * param) {/*some code*/}
private:
std::vector<Child*> Items;
};
 
template <class Child>
Child * MainObject<Child>::Add(char const* param){
Child* Temp=new Child;
if (is_base_of(MTop,Child) { //ВОТ ТУТ как ни крутился и dynamic_cast и специализации а некак
Temp->SetParam(param);
}
Items.push_back(Temp);
return Temp;
}
 
class SomeData:public MainObject<int>
{
};
class SomeOtherData:public MainObject<SomeData>
{
};
Вот где коммент , логика очень простая если тип CHILD унаследован от MainObject то выполнить над ним определенные действия , если нет (даже пусть любой простой тип) то просто вернуть на него указатель , но КАК это сделать , ведь есть же готовое решение!
Помогите пожалуйста , очень давно ломаю голову!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.08.2013, 21:49
Ответы с готовыми решениями:

Применение метапрограммирования
Доброго времени суток форумчане. Собственно говоря, как часто применимо метапрограммирование в современном мире разработок на C++. И имеет...

Библиотека метапрограммирования
Увлекшись метапрограммированием, начатым в предыдущей теме, я решил написать небольшую библиотеку метафункций. Изначально всё это...

В разделе "редактор шаблонов" в таблице нет файлов шаблонов
Привет, помогите с проблемой в движке DLE, в разделе редактор шаблонов в таблице нет файлов шаблона куда то пропали. Пропали после того как...

6
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
28.08.2013, 22:02
Цитата Сообщение от Andreyasu Посмотреть сообщение
логика очень простая если тип CHILD унаследован от MainObject то выполнить над ним определенные действия , если нет (даже пусть любой простой тип) то просто вернуть на него указатель , но КАК это сделать , ведь есть же готовое решение!
есть std::is_base_of .

Добавлено через 9 минут
Либо как-нибудь так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<typename T>
void set_param_if_needed(T *, char const*) {}
 
template<typename T>
void set_param_if_needed(MainObject<T> * const object, char const* const param) {
   object->setParam(param);
}
 
template <class Child>
Child * MainObject<Child>::Add(char const* param){
   // ...
   set_param_if_needed(Temp, param);
   // ...
}
1
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
28.08.2013, 22:24  [ТС]
C++
1
2
template <class Child>
class MainObject:public MTop
//забыл тут

Добавлено через 7 минут
is_base_of от boost использую , проблема именно в выполнении что бы не ругался компилятор!!!
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
28.08.2013, 22:35
Ну так
C++
1
2
3
if (is_base_of<MTop, Child>::value) {
   // ...
}
Так не работает?
1
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
28.08.2013, 22:43  [ТС]
C++
1
2
3
4
5
6
7
template<typename T>
void set_param_if_needed(T *, char const*) {}
 
template<typename T>
void set_param_if_needed(MainObject<T> * const object, char const* const param) {
   object->setParam(param);
}
так не хочет , видимо потому что тип Child - SomeData , а на лету привести его к родителю шаблон на стадии компиляции не может ((по крайней мере у меня второй шаблон перегруженной функции никогда не вызывался

C++
1
2
3
4
5
#include  <boost/type_traits.hpp>
if (boost::is_base_of<MTop,Child>())// - тут все ок работает на ура, но дальше я в смятении что делать
{
//а вот тут что писать? допустим это не инт хорошо определи а дальше??
}
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
28.08.2013, 22:57
Цитата Сообщение от Andreyasu Посмотреть сообщение
//а вот тут что писать? допустим это не инт хорошо определи а дальше??
Да, так не получиться.
Можно вот так: http://ideone.com/NUbODr
enable_if есть в boost.

Добавлено через 1 минуту
Цитата Сообщение от gray_fox Посмотреть сообщение
Либо как-нибудь так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename T>
void set_param_if_needed(T *, char const*) {}
template<typename T>
void set_param_if_needed(MainObject<T> * const object, char const* const param) {
 object->setParam(param);
}
template <class Child>
Child * MainObject<Child>::Add(char const* param){
 // ...
 set_param_if_needed(Temp, param);
 // ...
}
Да, это не работает )

Добавлено через 2 минуты
Цитата Сообщение от gray_fox Посмотреть сообщение
Можно вот так: http://ideone.com/NUbODr
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<typename T>
typename std::enable_if<!std::is_base_of<MTop, T>::value>::type
set_param_if_needed(T *, char const*) {}
 
template<typename T>
typename std::enable_if<std::is_base_of<MTop, T>::value>::type
set_param_if_needed(T * const object, char const* const param) {
   object->SetParam(param);
}
 
template <class Child>
Child * MainObject<Child>::Add(char const* param){
   Child* Temp=new Child;
   set_param_if_needed(Temp, param);
   Items.push_back(Temp);
   return Temp;
}
1
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
28.08.2013, 23:03  [ТС]
вот спасибо - пока не понял как но работает!!! сейчас разберусь но с меня причитается думаю надо посмотреть еще в эту сторону тогда http://www.boost.org/doc/libs/... le_if.html
может у вас еще по этой теме идеи есть? lexical cast
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.08.2013, 23:03
Помогаю со студенческими работами здесь

Паттерны
Паттерн Flyweight Паттерн Domain Model (Модель области определения).Кто знает что это.И может на сайте есть коды хоть примерно этого.

Паттерны
Пролистал всю главную страницу и решил поставить вопрос в С++ , чем сможите помогите. Суть , изучаю объектно ориентированное...

Паттерны в програмировании
И так предлагаю поговорить о паттернах в программировании. Что нам о них известно и что вообще такое паттерн в программировании? В процессе...

Паттерны в роутинге
Здравствуйте. Помогите разобраться с паттернами в роутинге. Как их использовать? немного не понятен механизм. Ну к примеру у нас есть...

Паттерны Java
Здравствуйте, прошу помощи в опытных людей, на днях нужно сдавать практические по паттернам, а сказать что мы их проходили и разбирали...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru