variadic templates и "разворот" в типы посредники
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.01.12 11:44
Оценка:
всем привет.

всем привет.

к примеру, имеется у нас следующая функция:
template<typename... Args>
void func(const Args&... args) {}

используем мы ее как обычно:
func(1);
func(1,2);

тут проблем нет.

теперь давайте представим, что эта функция на самом деле декларирована так:
void func(ArgWrapper a0 = ArgWrapper(0,0), ArgWrapper a1 = ArgWrapper(0,0), ArgWrapper a2 = ArgWrapper(0,0), и т.д....) {}

а мы хотим ее использовать так:
struct type {
   template<typename... Args>
   static void method(const Args&... args) {
      func(args...); // тут как записать?
   }
};


т.е. проблема в том, что функция не моя, а мне нужно под нее подстраиваться.
вторая проблема в том, что у функции каждый аргумент (ArgWrapper) получает два значения которые описывают один аргумент.

в общем, последний пример, для ясности должен компилятором генерироваться так:
struct type {
   template<typename... Args>
   static void method(const Args&... args) {
      func(
         ArgWrapper(typeid(args[0]).name(), args[0]),
         ArgWrapper(typeid(args[1]).name(), args[1]),
         ArgWrapper(typeid(args[2]).name(), args[2])
      );
   }
};


не знаю как еще объяснить..

всем благодарен.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: variadic templates и "разворот" в типы посредники
От: jazzer Россия Skype: enerjazzer
Дата: 11.01.12 12:32
Оценка: 9 (1) +1
Здравствуйте, niXman, Вы писали:

ну так допиши просто многоточие после этого:
X>
X>      func( ArgWrapper(typeid(args).name(), args)... );
X>
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: variadic templates и "разворот" в типы посредники
От: Masterkent  
Дата: 11.01.12 12:32
Оценка: 9 (1) +1
Надо что-то вроде этого?
Re[2]: variadic templates и "разворот" в типы посредники
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.01.12 14:52
Оценка:
Вы оба правы.
я не знал что при "развороте" вариадика, продублируется так же и выражение в котором вариадик используется.

всем благодарен.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: variadic templates и "разворот" в типы посредники
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.01.12 19:27
Оценка:
Здравствуйте, Masterkent,
позвольте микровопрос.
запланирована ли(возможно еще не реализованная) возможность обращаться к parameters_pack по индексу?
глянул стандарт(драфт), но ничего об этом не нашел. возможно плохо искал.

благодарен.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: variadic templates и "разворот" в типы посредники
От: Masterkent  
Дата: 11.01.12 22:55
Оценка: 12 (2) +1
niXman:

X>запланирована ли(возможно еще не реализованная) возможность обращаться к parameters_pack по индексу?


Насколько мне известно, комитет пока не составил каких-либо планов насчёт развития C++ в ближайшем будущем и, собственно, составление этих планов планируется провести на ближайшей февральской встрече в Kona.

В конце ноября прошлого года на рефлекторе комитета возможность обращения к элементам паков по индексу немножко пообсуждали. Насчёт того, собираются ли её вводить, вроде, ничего не говорили. Обсуждение свелось к тому, что вменяемого синтаксиса пока не предложено.

Полагаю, скоро должны опубликовать pre-Kona mailing (приём рабочих документов заканчивается 13.01), и, возможно, там будет какое-нибудь интересное предложение относительно данной фичи.
Re[4]: variadic templates и "разворот" в типы посредники
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.01.12 22:57
Оценка:
Здравствуйте, Masterkent,

понял.
благодарен.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: variadic templates и "разворот" в типы посредники
От: Masterkent  
Дата: 12.01.12 12:53
Оценка: 8 (2) +1
В принципе, с помощью костылей достать тип или значение из пака можно и сейчас:

template <int i, class T, class... Types>
    struct TypesPackItemImpl :
        public TypesPackItemImpl<i-1, Types...>
            {};
template <class T, class... Types>
    struct TypesPackItemImpl<0, T, Types...>
        { using type = T; };

template <int i, class... Types>
    using TypesPackItem = typename TypesPackItemImpl<i, Types...>::type;

template <int n>
    struct ValuesPackItem
{
    template <class T, class... Types>
        constexpr auto operator ()(T t, Types... params) const ->
            decltype(ValuesPackItem<n - 1>()(params..., 0))
                { return ValuesPackItem<n - 1>()(params..., 0); } // дополнительный аргумент помещён из-за бага GNU C++ 4.7.0
};
template <>
    struct ValuesPackItem<0>
{
    template <class T, class... Types>
        constexpr T operator ()(T t, Types... params) const
            { return t; }
};

template <int n, class T, class... Types>
    constexpr auto values_pack_item(T t, Types... params) ->
        decltype(ValuesPackItem<n>()(t, params...))
            { return ValuesPackItem<n>()(t, params...); }


// Test

#include <type_traits>

#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)

template <class... Types>
    struct X
{
    STATIC_ASSERT(std::is_same<TypesPackItem<0, Types...>, int>{});
    STATIC_ASSERT(std::is_same<TypesPackItem<1, Types...>, void>{});
    STATIC_ASSERT(std::is_same<TypesPackItem<2, Types...>, char()>{});
};

template <int... values>
    struct Y
{
    STATIC_ASSERT(values_pack_item<0>(values...) == 11);
    STATIC_ASSERT(values_pack_item<1>(values...) == 22);
    STATIC_ASSERT(values_pack_item<2>(values...) == 33);
};

int main()
{
    X<int, void, char()>();
    Y<11, 22, 33>();
}

Конечно, короткая запись вроде pack...[index] была бы удобнее.
Re[5]: variadic templates и "разворот" в типы посредники
От: niXman Ниоткуда https://github.com/niXman
Дата: 12.01.12 17:20
Оценка:
Здравствуйте, Masterkent,

скажите, Вы этот код на версии 4.7.0 проверяли?
дело в том, что 4.6.2 ругается: http://liveworkspace.org/code/65771fbdf19d209ace554a1e5581f57c
а 4.7.0 нет под рукой.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[6]: variadic templates и "разворот" в типы посредники
От: Masterkent  
Дата: 12.01.12 20:18
Оценка: 3 (1) +1
niXman:

X>скажите, Вы этот код на версии 4.7.0 проверяли?


Да.

X>дело в том, что 4.6.2 ругается: http://liveworkspace.org/code/65771fbdf19d209ace554a1e5581f57c


Это из-за недостаточно проработанной реализации экспансии паков и отсутствия поддержки alias templates. Рабочий вариант для v4.6.2 будет более громоздким:

http://liveworkspace.org/code/b5e5515aff98805c3d22822314a525ac
Re[7]: variadic templates и "разворот" в типы посредники
От: niXman Ниоткуда https://github.com/niXman
Дата: 12.01.12 20:51
Оценка:
Здравствуйте, Masterkent,

все понял.

спасибо за примеры.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.