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

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

28.08.2013, 21:49. Показов 995. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru