Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
28.08.2013, 21:49     Паттерны метапрограммирования шаблонов #1
Нигде не могу найти литературу по паттернам метапрограммирования шаблонов, александреску не предлагать))
конкретно не могу понять как решить такую ситуацию
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 то выполнить над ним определенные действия , если нет (даже пусть любой простой тип) то просто вернуть на него указатель , но КАК это сделать , ведь есть же готовое решение!
Помогите пожалуйста , очень давно ломаю голову!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2013, 21:49     Паттерны метапрограммирования шаблонов
Посмотрите здесь:

Паттерны C++
Паттерны C++
Гибкая архитектура и порождающие паттерны C++
C++ Порождающие паттерны
C++ Паттерны проектирования, нужен код на С++ и UML диаграмма
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
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);
   // ...
}
Andreyasu
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 использую , проблема именно в выполнении что бы не ругался компилятор!!!
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
28.08.2013, 22:35     Паттерны метапрограммирования шаблонов #4
Ну так
C++
1
2
3
if (is_base_of<MTop, Child>::value) {
   // ...
}
Так не работает?
Andreyasu
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>())// - тут все ок работает на ура, но дальше я в смятении что делать
{
//а вот тут что писать? допустим это не инт хорошо определи а дальше??
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2013, 23:03     Паттерны метапрограммирования шаблонов
Еще ссылки по теме:

Паттерны проектирования (Фабрики) C++
Какие паттерны используются в программе и для чего? C++
Тест и задачи на smartPtr и паттерны C++

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

Или воспользуйтесь поиском по форуму:
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
28.08.2013, 23:03  [ТС]     Паттерны метапрограммирования шаблонов #7
вот спасибо - пока не понял как но работает!!! сейчас разберусь но с меня причитается думаю надо посмотреть еще в эту сторону тогда http://www.boost.org/doc/libs/1_54_0...enable_if.html
может у вас еще по этой теме идеи есть? lexical cast
Yandex
Объявления
28.08.2013, 23:03     Паттерны метапрограммирования шаблонов
Ответ Создать тему
Опции темы

Текущее время: 16:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru