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

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

28.08.2013, 21:49. Просмотров 581. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2013, 21:49
Ответы с готовыми решениями:

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

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

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

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

6
What a waste!
1576 / 1277 / 171
Регистрация: 21.04.2012
Сообщений: 2,677
28.08.2013, 22:02 2
Цитата Сообщение от 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  [ТС] 3
C++
1
2
template <class Child>
class MainObject:public MTop
//забыл тут

Добавлено через 7 минут
is_base_of от boost использую , проблема именно в выполнении что бы не ругался компилятор!!!
0
What a waste!
1576 / 1277 / 171
Регистрация: 21.04.2012
Сообщений: 2,677
28.08.2013, 22:35 4
Ну так
C++
1
2
3
if (is_base_of<MTop, Child>::value) {
   // ...
}
Так не работает?
1
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
28.08.2013, 22:43  [ТС] 5
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!
1576 / 1277 / 171
Регистрация: 21.04.2012
Сообщений: 2,677
28.08.2013, 22:57 6
Цитата Сообщение от 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  [ТС] 7
вот спасибо - пока не понял как но работает!!! сейчас разберусь но с меня причитается думаю надо посмотреть еще в эту сторону тогда http://www.boost.org/doc/libs/... le_if.html
может у вас еще по этой теме идеи есть? lexical cast
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2013, 23:03

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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

Паттерны проектирования
Посоветуйте информацию об изучении паттернов iterator, abstract factory, singleton, decorator на...

Паттерны Java
Привет всем. Хочу поинтересоваться, какие основные шаблоны проектирования нужно знать Junior...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.