Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 08.05.2013, 16:21   #1
220Volt
Участник клуба
 
Регистрация: 14.12.2012
Адрес: Россия
Сообщений: 683
Репутация: 199
По умолчанию Variadic templates

Здравствуйте!
Как передавать несколько parameter pack’ов? Пример:
Код:
template <typename... _Ty1, typename... _Ty2>
            void fn(_Ty1... args1,
                    _Ty2... args2)  {}
int main()
{
    fn( 3, 3 );
    return 0;
}
Компилируется, но как четко задать какие параметры в args1, а какие в args2?
220Volt вне форума   Ответить с цитированием
Старый 09.05.2013, 16:09   #2
220Volt
Участник клуба
 
Регистрация: 14.12.2012
Адрес: Россия
Сообщений: 683
Репутация: 199
По умолчанию

Решил вопрос при помощи std::tuple. Была задача - передать элементы в конструкторы родителей шаблона. Получилось что-то вроде:
Код:
#include <tuple>

struct S1
{
    int v1_1;
    int v1_2;
    S1(int v1_1, int v1_2): v1_1(v1_1), v1_2(v1_2) {}
    S1(std::tuple<int, int> pack)   { std::tie(this->v1_1, this->v1_2) = pack; }
};

struct S2
{
    int v2_1;
    int v2_2;
    S2(int v2_1, int v2_2): v2_1(v2_1), v2_2(v2_2) {}
    S2(std::tuple<int, int> pack)   { std::tie(this->v2_1, this->v2_2) = pack; }
};

template <typename _T1, typename _T2>
    struct Sd : public _T1, public _T2
    {
        template <typename... _Targs1, typename... _Targs2>
            Sd(std::tuple<_Targs1...> pack1,
               std::tuple<_Targs2...> pack2): _T1(pack1), _T2(pack2) {}
    };

int main()
{
    Sd<S1, S2> f( std::make_tuple(4, 6),    // Передаем в конструктор S1
                  std::make_tuple(2, 1)     // Передаем в конструктор S2
                );
    return 0;
}
220Volt вне форума   Ответить с цитированием
Старый 16.05.2013, 07:42   #3
220Volt
Участник клуба
 
Регистрация: 14.12.2012
Адрес: Россия
Сообщений: 683
Репутация: 199
По умолчанию

Так как появились variadic шаблоны и возможность наследоваться от variadic аргументов, на мой взгляд, появилась необходимость организовывать compile time циклы. Например, написать operator== или дочерний объект – это сумма возможностей родителей, т.е. нужно перебрать всех предков и вызвать нужные методы. В последние дни много плясал с бубном и реализовал такую штуку. Оставлю здесь, чтоб не потерялось, может кому пригодится (mingw):
Код:
struct S_base     { virtual void print() = 0; };

struct S_1 : virtual public S_base     {  void print()override   { std::cout<<"S_1\n"; }  };

struct S_2 : virtual public S_base     {  void print()override   { std::cout<<"S_2\n"; }  };

struct S_3 : virtual public S_base     {  void print()override   { std::cout<<"S_3\n"; }  };

namespace compound_object
{
    template <typename _This_type, typename... _Args>
        struct Compile_time_cycle
        {
            static void cycle(_This_type _this)
            {
                _this->template sub_print<_Args...>();
            }
        };

    template <typename _This_type>                  // Все аргументы обработаны, выход из цикла.
        struct Compile_time_cycle<_This_type>
        {
            static void cycle(_This_type thi) {}
        };

    template <typename... _Ty>
        struct S_final : public _Ty...
        {
        template <typename _This_type, typename... _Args>
            friend struct Compile_time_cycle;
        private:
            template <typename _First, typename... _Other>
                void sub_print()
                {
                    _First::print();
                    Compile_time_cycle<decltype(this), _Other...>::cycle(this);
                }
        public:
            void print()override
            {
               Compile_time_cycle<decltype(this), _Ty...>::cycle(this);
            }
        };
}


int main()
{
    std::cout<<"----------  p1 :\n";
    S_base *p1 =  new compound_object::S_final<S_3, S_1>();
    p1->print();
    std::cout<<'\n';

    std::cout<<"----------  p2 :\n";
    S_base *p2 =  new compound_object::S_final<S_1>();
    p2->print();
    std::cout<<'\n';

    std::cout<<"----------  p3 :\n";
    S_base *p3 =  new compound_object::S_final<S_2, S_3>();
    p3->print();
    std::cout<<'\n';

    return 0;
}
220Volt вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
variadic templates и компиляторы _Bers Общие вопросы C/C++ 4 18.01.2013 09:55
Variadic Templates и их применение в качестве списка полей Пепел Феникса Общие вопросы C/C++ 9 13.08.2012 17:24
fun with C++ templates pproger Общие вопросы по программированию, компьютерным наукам 3 12.01.2011 21:26
MSVS templates coinkrsk Общие вопросы C/C++ 2 30.09.2010 09:51


04:14.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.