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

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 08.05.2013, 15:21   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 683
По умолчанию 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, 15:09   #2
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 683
По умолчанию

Решил вопрос при помощи 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, 06:42   #3
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 683
По умолчанию

Так как появились 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 вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


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


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS