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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
#1

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

28.08.2013, 21:49. Просмотров 454. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2013, 21:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Паттерны метапрограммирования шаблонов (C++):

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

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

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

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

Порождающие паттерны - C++
enum Direction {North, South, East, West} class MapSite { public: virtual void Enter() = 0; } class Room: public MapSite { ...

Паттерны проектирования (Фабрики) - C++
Добрый вечер. Есть игра &quot;Морской бой&quot; из учебника Павловской Т.А . Задача: добавить в ней какой-либо шаблон проектирования. Я...

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

Гибкая архитектура и порождающие паттерны - C++
У меня возник вопрос следующего характера. Предположим, что есть некоторый интерфейсный класс фильтра, есть реализации, наследованные от...

Тест и задачи на smartPtr и паттерны - C++
Здравствуйте. По некоторым обстоятельствам случилось так, что выделенное время на подготовку к экзамену по С++ мне пришлось...

С чего начать изучать паттерны проектирования? - C++
С чего лучше всего начать изучение паттернов проектирования новичку? Большинство говорят, что надо читать классику - банду четырех. С чего...

Паттерны проектирования, нужен код на С++ и UML диаграмма - C++
Декоратор (Decorator) или Оболочка (Wrapper) - GoF Итератор (Iterator) или Курсор (Cursor) - GoF Одиночка (Singleton) - GoF


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.08.2013, 23:03
Ответ Создать тему
Опции темы

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