Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2014, 23:05   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию Избирательное наследование от parametr pack'a

Код:
struct AND {};
struct OR {};

struct S1 {};
struct S2 {};
struct S3 {};

template <typename... _T>
struct QQ : public _T... {};
 
int main()
{
    QQ <S1, AND, S2, AND, S3> qq;
    
    return 0;
}
Как сделать предком для QQ каждый второй тип (S1, S2, S3)? Количество S неизвестно. Или вместо AND и OR подставить какой-нибудь template <int index> empty; Но откуда взять индекс? Нужна какая-то compile time переменная.

Последний раз редактировалось 220Volt; 21.05.2014 в 23:08.
220Volt вне форума Ответить с цитированием
Старый 22.05.2014, 00:40   #2
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Всё, додумался:
Код:
#include <iostream>
using namespace std;

struct AND {};
struct OR {};

struct S1 { int s{1}; };
struct S2 { int s{2}; };
struct S3 { int s{3}; };

//---- Делаем "прокладку"---
template <typename... _Tail>
struct W {};

template <typename _Type, typename _Operator, typename... _Tail>
struct W<_Type, _Operator, _Tail...> : virtual public _Type, public W<_Tail...> {};

template <typename _Type>
struct W<_Type> : virtual public _Type {};
//-------------------------

template <typename... _T>
struct QQ : public W<_T...> {};
 
int main()
{
    QQ <S1, AND, S2, AND, S3, OR, S2, AND, S1> qq;
    // проверка 
    cout << qq.S1::s << "\n";
    cout << qq.S2::s << "\n";
    cout << qq.S3::s << "\n";
    
    return 0;
}

Последний раз редактировалось 220Volt; 22.05.2014 в 01:10.
220Volt вне форума Ответить с цитированием
Старый 22.05.2014, 04:54   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Зачем это? )
rrrFer вне форума Ответить с цитированием
Старый 22.05.2014, 05:52   #4
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Зачем это? )
Сложно объяснить )). Это что-то вроде подключения модулей к классу. Класс занимается поиском. Например, найти холодное И мокрое ИЛИ теплое И сухое. Вообще я в восторге, очень гибко.

P.S: если кого-то это интересует, могу привести код, в котором отсутствует виртуальное наследование.

Последний раз редактировалось 220Volt; 23.05.2014 в 04:21.
220Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ADOQuery1:Parametr 'id_i' not found Pykhov SQL, базы данных 3 29.08.2013 04:11
Items pack Антонн C# (си шарп) 0 03.11.2012 01:26
Как создать переменные типа %name% или %parametr% и т.п. webber9989 Общие вопросы Delphi 2 12.04.2012 22:01
DS Pack - audiostream nXs Мультимедиа в Delphi 10 26.03.2010 10:51
MediaPlayer и кодеки вроде K-Lite codec pack, xp codec pack Rend1 Мультимедиа в Delphi 2 03.02.2008 20:17