Russian Qt Forum
Май 23, 2024, 22:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4]   Вниз
  Печать  
Автор Тема: Паттерн visitor для boost::any  (Прочитано 25290 раз)
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #45 : Октябрь 24, 2015, 22:27 »

Запилил ещё одну меташаблонную фичу: merge, которая объединяет текущий type_list со списком других типов, т.е.

Код
C++ (Qt)
typedef type_list<int, bool, float> default_type_list;
struct some_visitor : public any_visitor<void, merge<default_type_list, double, std::string, long /* и т.д. */ >::type>
{
...
};
 
« Последнее редактирование: Октябрь 24, 2015, 22:29 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #46 : Октябрь 25, 2015, 08:10 »

Запилил ещё одну меташаблонную фичу: merge, которая объединяет текущий type_list со списком других типов, т.е.
У меня это плохо укладывается в голове Улыбающийся Покажите реализацию
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #47 : Октябрь 25, 2015, 11:14 »

Цитировать
У меня это плохо укладывается в голове  Улыбающийся Покажите реализацию
Вот же:
Код
C++ (Qt)
namespace detail
{
   template<class, class>
   struct merge_helper;
 
   template <class T, class...Types>
   struct merge_helper<type_list<Types...>, T>
   {
       typedef type_list<T, Types...> type;
   };
 
} /* namespace detail */
 
template <class T, class A, class...Types>
struct merge
{
   typedef typename merge<typename detail::merge_helper<T, A>::type, Types...>::type type;
};
 
template <class T, class A>
struct merge<T, A>
{
   typedef typename detail::merge_helper<T, A>::type type;
};
 

Код
C++ (Qt)
typedef type_list<int, long, double> my_type_list;
 
std::cout << std::boolalpha << std::is_same<typename merge<my_type_list, bool, std::string>::type, type_list<std::string, bool, int, long, double>>::value << std::endl;
 
« Последнее редактирование: Октябрь 25, 2015, 11:30 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: 1 2 3 [4]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.118 секунд. Запросов: 22.