Re[10]: хитрая конструкция
От: Abyx Россия  
Дата: 07.03.15 20:47
Оценка: +2 -4
Здравствуйте, x-code, Вы писали:

XC>Что-то эта тема (шаблоны с переменным числом аргументов) как-то вообще мимо меня прошла

XC>Вы можете рассказать хоть что-то поподробнее, как оно вообще работает?
XC>Как такие шаблоны разворачиваются в компиляторе?
XC>Какие есть вообще способы с ними работать?

и тебя в гугле забанили? попробуй тогда какой-нибудь яндекс или поиск мейл.ру
In Zen We Trust
Re[11]: хитрая конструкция
От: Vain Россия google.ru
Дата: 08.03.15 11:26
Оценка: +4 -2
Здравствуйте, Abyx, Вы писали:

A>и тебя в гугле забанили? попробуй тогда какой-нибудь яндекс или поиск мейл.ру

учись у Кодта объяснять а не гнать людей отсюда
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[10]: хитрая конструкция
От: Кодт Россия  
Дата: 07.03.15 21:26
Оценка: 16 (4)
Здравствуйте, x-code, Вы писали:

XC>Что-то эта тема (шаблоны с переменным числом аргументов) как-то вообще мимо меня прошла

XC>Вы можете рассказать хоть что-то поподробнее, как оно вообще работает?
XC>Как такие шаблоны разворачиваются в компиляторе?
XC>Какие есть вообще способы с ними работать?

Как разворачиваются: берётся серия аргументов (параметров шаблона, аргументов функции) и подставляется одним махом.
template<bla,bla,bla> struct Foo; // не обязательно вариадик, а просто много-много-арный шаблон

void foo(bla,bla,bla); // то же самое - там могут быть и дефолтные параметры, и сишный эллипсис,
void foo(); // и перегрузки, и что угодно


template<class... Args> void bar(Args... args) // если параметры шаблона не указаны, они довыводятся из аргументов
{
  Foo<Args...> x; // подставили параметры шаблона - здесь типы - в параметры другого шаблона.
  foo(args...); // подставили серию аргументов
  sizeof...(Args); // число параметров шаблона
  sizeof...(args); // число аргументов функции

  int   xs[] = { f<Args>()... }; // подставили каждый элемент Args в выражение - например, в шаблон функции
  void* ys[] = { new Args()... }; // необязательно в шаблон - типы можно использовать как угодно
  int   zs[] = { f(args)... }; // подставили каждый элемент args
}


Ну и всякие операции над сериями параметров шаблонов возможны. Например, сопоставление (с началом серии).
В общем, метапрограммирование во всей красе. Раньше был лисп, а теперь чуть-чуть не дотянули до рефала.
template<class... Args> struct mpl_series {};

// можно делать сопоставление глубоко

template<class> struct mpl_front;
template<class X, class... Args> struct mpl_front< mpl_series<X,Args...> > { typedef X type; };

// а можно и непосредственно

template<class... Args> struct mpl_sizeof;
template<> struct mpl_sizeof<> {
  static int const value = 1;
};
template<class X, class... Rest> struct mpl_sizeof<X,Rest...> {
  static int const value = 1 + mpl_sizeof<Rest...>::value;
};

// единственно, склеивать две последовательности напрямую не выйдет, хотя бы одна должна быть упакована

template<class Series, class...> struct mpl_append;
template<class... Xs, class... Ys> struct mpl_append< mpl_series<Xs...>, Ys... >
 { typedef mpl_series<Xs...,Ys...> type; };

template<class Series1, class Series2> struct mpl_concat;
template<class... Xs, class... Ys> struct mpl_concat< mpl_series<Xs...>, mpl_series<Ys...> >
 { typedef mpl_series<Xs...,Ys...> type; };

// и, с хвостом серии нельзя напрямую сопоставляться, хвост можно только порождать

template<class Series> struct mpl_rotate;
template<class X, class...Ys> struct mpl_rotate< mpl_series<X,Ys...> >
 { typedef mpl_series<Ys...,X> };
Перекуём баги на фичи!
хитрая конструкция
От: Hard_Club  
Дата: 06.03.15 11:48
Оценка: +1 -2
что обозначает данная конструкция:

template <class F, class... Args>
    void fa(F f, Args&&... args) {
        [](...){}((f(std::forward<Args>(args)), 0)...);
}
Re[8]: хитрая конструкция
От: Кодт Россия  
Дата: 06.03.15 15:14
Оценка: 25 (2)
Здравствуйте, Hard_Club, Вы писали:

X>>да, использование лямбды тут совершенно необосновано.


H_C>а как можно без лямбды?


Да любым способом утилизировать произвольное количество аргументов.
void devnull(...) {}

#define CALL(expr) ( (expr), void(), 0 ) // выполняет выражение, возможно, типа void, и возвращает int 0

template<class F, class... Xs>
void each(F f, Xs&&... xs)
{
  devnull( CALL(f(xs))... );
  (void) std::initializer_list<int> { CALL(f(xs))... };
  int nulls[] = { CALL(f(xs))... };

}
Перекуём баги на фичи!
Отредактировано 06.03.2015 15:15 Кодт . Предыдущая версия .
Re[3]: хитрая конструкция
От: Nikе Россия  
Дата: 06.03.15 12:38
Оценка: 2 (1)
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Nikе, Вы писали:


N>>оно ведёт себя по разному на разных компиляторах.

X>приведите пример.

template <class F, class... Args> void fa( F f, Args&&... args )
{
    []( ... ) {}( ( f( std::forward<Args>( args ) ), 0 )... );
}

fa( []( int a ) { cout << a ); }, 1, 2, 3, 4, 5 );


VS 2015 и GCC 4.91: 54321

CLang 6.0.56: 12345
Нужно разобрать угил.
Re[9]: хитрая конструкция
От: x-code  
Дата: 07.03.15 19:56
Оценка: -1
Здравствуйте, Кодт, Вы писали:

К>Да любым способом утилизировать произвольное количество аргументов.


Что-то эта тема (шаблоны с переменным числом аргументов) как-то вообще мимо меня прошла
Вы можете рассказать хоть что-то поподробнее, как оно вообще работает?
Как такие шаблоны разворачиваются в компиляторе?
Какие есть вообще способы с ними работать?
Re[12]: хитрая конструкция
От: Hard_Club  
Дата: 08.03.15 13:24
Оценка: -1
во-во
Re[12]: хитрая конструкция
От: Кодт Россия  
Дата: 08.03.15 16:37
Оценка: +1
Здравствуйте, x-code, Вы писали:

XC>Похоже на обычные кортежи времени компиляции (tuples) в свойственной С++ извращенной манере

XC>И раскрытие этих "пакетов параметров", как я понимаю, только или пакетом (сразу все) или рекурсивно?

Вот в этом-то и услада, что сразу всё, а не рекурсивно, как в былые времена.
Плюс, можно делать вещи, которые на рекурсии в принципе невозможны. Массив создать, например. Или функцию с кучей параметров вызвать.
Не, раньше тоже выкручивались, генерировали достаточное количество перегрузок на все разумные случаи арности.
Но это хорошо, когда у тебя есть буст, а у буста есть соответствующие решения.
А тут без буста можно, сразу.
Перекуём баги на фичи!
Re[2]: хитрая конструкция
От: Lonely Dog Россия  
Дата: 10.03.15 07:25
Оценка: -1
Здравствуйте, niXman, Вы писали:

X>может быть ты уже хоть раз прочтешь книжку?!

А может ты перестанешь посылать людей читать книжку? Лень отвечать на простой (для тебя) вопрос, пройди мимо. В чем проблема?
Re[12]: хитрая конструкция
От: Abyx Россия  
Дата: 10.03.15 10:17
Оценка: +1
Здравствуйте, Lonely Dog, Вы писали:

LD>А в гугле/яндексе как эта информация появилась? Кто-то спросил, ему ответили. Почему нельзя спрашивать здесь?


нет, начала написали пропозалы, потом Струструп написал C++11 FAQ, потом это скопировали в википедию на 100 языках,
а потом набежала толпа ленивых нубов, и они начали задавать вопросы, ответы на которые написаны в википедии/FAQ
In Zen We Trust
Re[14]: хитрая конструкция
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.03.15 11:29
Оценка: :)
Здравствуйте, Lonely Dog, Вы писали:

LD>RSDN ценен контентом, а не ответами в стиле "ищи в гугле". Жаль, что ты этого не понимаешь

понимать это должны те, кто с этого что-то получает
мне, и еще многим, на rsdn просто нас****, ибо выбор огромен
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[18]: хитрая конструкция
От: Lonely Dog Россия  
Дата: 11.03.15 07:58
Оценка: :)
Здравствуйте, x-code, Вы писали:


XC>В общем, книжки это хорошо, но недостаточно.

XC>Вопрос про данную хитрую конструкцию вполне достойный. Я понимаю, если бы спросили как работает оператор if, или, простихосподи, goto. Или просили бы написать лабу в стиле "ввести два числа, вывести сумму двух чисел". Но тут — какая-то хитровывернутая конструкция из малоизвестных, экзотических и только-что появившихся возможностей С++.

О том и речь. У меня тупо нет времени изучать новые возможности C++. Узнаю про них из таких вот постов. Вряд ли буду использовать, но для общего развития интересно.
Re: хитрая конструкция
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.03.15 11:50
Оценка:
может быть ты уже хоть раз прочтешь книжку?!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: хитрая конструкция
От: Nikе Россия  
Дата: 06.03.15 12:32
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>что обозначает данная конструкция:


Вызвать функцию f для каждого аргумента функции fa.
Непонятно зачем так сложно, и оно ведёт себя по разному на разных компиляторах.
Нужно разобрать угил.
Re[2]: хитрая конструкция
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.03.15 12:34
Оценка:
Здравствуйте, Nikе, Вы писали:

N>оно ведёт себя по разному на разных компиляторах.

приведите пример.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: хитрая конструкция
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.03.15 12:40
Оценка:
Здравствуйте, Nikе, Вы писали:

N>VS 2015 и GCC 4.91: 54321


N>CLang 6.0.56: 12345


так вы об этом)
это нормально, и прописано в стандарте.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: хитрая конструкция
От: Abyx Россия  
Дата: 06.03.15 12:41
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>
H_C>template <class F, class... Args>
H_C>    void fa(F f, Args&&... args) {
H_C>        [](...){}((f(std::forward<Args>(args)), 0)...);
H_C>}
H_C>


это неправильная конструкция, f вызовется для аргументов в произвольном порядке.
правильно использовать массив или список инициализации
(void)std::initializer_list<int>{(f(std::forward<Args>(args)), void(), 0)...};


btw можно еще подискутировать как это называется тут — http://stackoverflow.com/questions/28887549/how-to-call-the-idiom-of-using-an-array-to-apply-a-function-to-a-variadic-pack
In Zen We Trust
Отредактировано 06.03.2015 12:42 Abyx . Предыдущая версия .
Re[5]: хитрая конструкция
От: Nikе Россия  
Дата: 06.03.15 12:44
Оценка:
Здравствуйте, niXman, Вы писали:

X>так вы об этом)

X>это нормально, и прописано в стандарте.

Как бы да. Просто сначала появилась версия, что такая форма как-то позволяет специфицировать порядок вызовов. Иначе совсем непонятно — зачем она нужна.
Нужно разобрать угил.
Re[6]: хитрая конструкция
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.03.15 12:46
Оценка:
Здравствуйте, Nikе, Вы писали:

N>Иначе совсем непонятно — зачем она нужна.

да, использование лямбды тут совершенно необосновано.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: хитрая конструкция
От: Hard_Club  
Дата: 06.03.15 13:28
Оценка:
X>да, использование лямбды тут совершенно необосновано.

а как можно без лямбды?
Re[9]: хитрая конструкция
От: Hard_Club  
Дата: 06.03.15 17:54
Оценка:
К>void devnull(...) {}

К>#define CALL(expr) ( (expr), void(), 0 ) // выполняет выражение, возможно, типа void, и возвращает int 0


К>template<class F, class... Xs>

К>void each(F f, Xs&&... xs)
К>{
К> devnull( CALL(f(xs))... );
К> (void) std::initializer_list<int> { CALL(f(xs))... };
К> int nulls[] = { CALL(f(xs))... };

К>}

К>[/c]

Как эта штука — #define CALL(expr) ( (expr), void(), 0 ) — называется в стандарте?
Re[10]: хитрая конструкция
От: Кодт Россия  
Дата: 06.03.15 19:21
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Как эта штука — #define CALL(expr) ( (expr), void(), 0 ) — называется в стандарте?


Comma operator
Неявно определён над любыми (в т.ч. void) операндами, строго последовательно выполняет их и возвращает значение правого операнда.
Здесь получается такая конструкция
#define COMMA(x,y) ((x),(y))
#define CALL(expr) COMMA( COMMA((expr),void()), 0 )

Первая запятая над expr и void нужна для того, чтобы предотвратить нечаянный выбор перегруженного оператора запятой. (Перегрузить оператор для void-аргумента в принципе невозможно).
Результат имеет тип void, а уже void,int — заведомо — неявно определён компилятором.

Подытоживая,
— f(x) — может быть void или какого-нибудь неудобного для передачи в (...) типа
— f(x),0 — может быть типа с перегруженным operator,(T,int) — получим вместо int неизвестно что
— f(x),void() — получим void, но ничего с ним не сможем сделать
— f(x),void(),0 — получим int
Перекуём баги на фичи!
Отредактировано 07.03.2015 11:23 Кодт . Предыдущая версия .
Re[11]: хитрая конструкция
От: Hard_Club  
Дата: 07.03.15 14:59
Оценка:
К>Подытоживая,
К>- f(x) — может быть void или какого-нибудь неудобного для передачи в (...) типа
К>- f(x),0 — может быть типа с перегруженным operator,(T,int) — получим вместо int неизвестно что
К>- f(x),void() — получим void, но ничего с ним не сможем сделать
К>- f(x),void(),0 — получим int

а что в данном случае void() со скобками
Re[12]: хитрая конструкция
От: Кодт Россия  
Дата: 07.03.15 16:57
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>а что в данном случае void() со скобками


Конструктор значения типа void %)
Ещё встречается чуть менее лаконичное (void)0
Перекуём баги на фичи!
Re[13]: хитрая конструкция
От: uzhas Ниоткуда  
Дата: 07.03.15 17:33
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Конструктор значения типа void %)

К>Ещё встречается чуть менее лаконичное (void)0

void — это какой-то хак в системе типизации, причем явно перегруженный смыслом
с одной стороны, это неполный "тип" и у него не может быть экземляров, а с другой стороны это и не тип вообще

вот тут можно немного почитать об этом
http://stackoverflow.com/questions/1043034/what-does-void-mean-in-c-c-and-c
Re[13]: хитрая конструкция
От: niXman Ниоткуда https://github.com/niXman
Дата: 07.03.15 18:39
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Ещё встречается чуть менее лаконичное (void)0

стОит отметить, что выражение типа:
int v = 0;
((void)v);

не означает, что v станет типом void. это просто "посыл" компилятору о том, что если v не используется, чтоб он не сообщал об этом.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[14]: хитрая конструкция
От: Кодт Россия  
Дата: 07.03.15 21:39
Оценка:
Здравствуйте, niXman, Вы писали:

X>стОит отметить, что выражение типа:

X>
X>int v = 0;
X>((void)v);
X>

X>не означает, что v станет типом void. это просто "посыл" компилятору о том, что если v не используется, чтоб он не сообщал об этом.

Как раз означает. Просто у нас не так много возможностей напрямую пообщаться с этим недотипом, не получив ill-formed программу.
Это return в шаблонах и лямбдах с выводом возвращаемого типа, а ещё старый добрый оператор запятая.

На самом деле, с таким же успехом можно любое выражение, содержащее v, написать. Лишь бы побочных эффектов у него не было.
int v = 0;
v; // так
v*0; // или так
sizeof(v); // или так

Но компилятор на это может сказать варнинг: "результат выражения никуда не использован".
Для функций делается попущение
template<class T>
int unused(T const&) { return 0; } // мы-то знаем, что эта функция ничего не делает

void f() {
  int v = 123;
  unused(v); // компилятор не расстраивается, что мы не использовали этот 0
  printf(""); // ведь здесь мы не использовали результат вычисления printf, а он там есть...
Перекуём баги на фичи!
Re[15]: хитрая конструкция
От: niXman Ниоткуда https://github.com/niXman
Дата: 08.03.15 08:08
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Как раз означает.

почему же тогда это int i = v+3; работает? как это возможно, к void прибавить три?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[11]: хитрая конструкция
От: x-code  
Дата: 08.03.15 12:21
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Как разворачиваются: берётся серия аргументов (параметров шаблона, аргументов функции) и подставляется одним махом.


Похоже на обычные кортежи времени компиляции (tuples) в свойственной С++ извращенной манере
И раскрытие этих "пакетов параметров", как я понимаю, только или пакетом (сразу все) или рекурсивно?
Re[11]: хитрая конструкция
От: Hard_Club  
Дата: 08.03.15 13:23
Оценка:
К> int xs[] = { f<Args>()... }; // подставили каждый элемент Args в выражение — например, в шаблон функции
тут получается массив из результатов вызовов

А что значит это:
void f(...)
Re[16]: хитрая конструкция
От: wander  
Дата: 08.03.15 14:35
Оценка:
Здравствуйте, niXman, Вы писали:

X>почему же тогда это int i = v+3; работает? как это возможно, к void прибавить три?


Ты как-то забываешь, что приведение не меняет свой операнд. Результат выражения — void. А v остался на месте.
Re[12]: хитрая конструкция
От: Кодт Россия  
Дата: 08.03.15 16:42
Оценка:
Здравствуйте, Hard_Club, Вы писали:

К>> int xs[] = { f<Args>()... }; // подставили каждый элемент Args в выражение — например, в шаблон функции

H_C>тут получается массив из результатов вызовов

H_C>А что значит это:

H_C>void f(...)

А это значит, что неплохо бы освежить основы языка Си.
printf видел?
int printf(const char* format, ...);

Функция, которая способна принять произвольное количество аргументов, — единственно, она не знает типы этих аргументов и лишь надеется на то, что вызывающая сторона положила туда нужные данные нужных типов в нужном количестве.
Но для функции-заглушки, которая ничего не делает, на содержимое пофиг.
Перекуём баги на фичи!
Re[10]: хитрая конструкция
От: PM  
Дата: 08.03.15 21:18
Оценка:
Здравствуйте, x-code, Вы писали:

К>>Да любым способом утилизировать произвольное количество аргументов.


XC>Что-то эта тема (шаблоны с переменным числом аргументов) как-то вообще мимо меня прошла

XC>Вы можете рассказать хоть что-то поподробнее, как оно вообще работает?
XC>Как такие шаблоны разворачиваются в компиляторе?
XC>Какие есть вообще способы с ними работать?

Посмотри на http://en.cppreference.com/w/cpp/language/parameter_pack там кратко и с достаточными примерами, чтобы понять суть
Re[11]: хитрая конструкция
От: Lonely Dog Россия  
Дата: 10.03.15 07:26
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, x-code, Вы писали:


XC>>Что-то эта тема (шаблоны с переменным числом аргументов) как-то вообще мимо меня прошла

XC>>Вы можете рассказать хоть что-то поподробнее, как оно вообще работает?
XC>>Как такие шаблоны разворачиваются в компиляторе?
XC>>Какие есть вообще способы с ними работать?

A>и тебя в гугле забанили? попробуй тогда какой-нибудь яндекс или поиск мейл.ру

А в гугле/яндексе как эта информация появилась? Кто-то спросил, ему ответили. Почему нельзя спрашивать здесь?

Вообще странно, раньше RSDN был более дружественным, счас народ изменился
Re[12]: хитрая конструкция
От: Hard_Club  
Дата: 10.03.15 10:04
Оценка:
LD>А в гугле/яндексе как эта информация появилась? Кто-то спросил, ему ответили. Почему нельзя спрашивать здесь?

LD>Вообще странно, раньше RSDN был более дружественным, счас народ изменился :)


А в Java ветке вообще
Re[3]: хитрая конструкция
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.03.15 10:28
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>А может ты перестанешь посылать людей читать книжку?

нэд.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[13]: хитрая конструкция
От: Lonely Dog Россия  
Дата: 10.03.15 11:01
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, Lonely Dog, Вы писали:


LD>>А в гугле/яндексе как эта информация появилась? Кто-то спросил, ему ответили. Почему нельзя спрашивать здесь?


A>нет, начала написали пропозалы, потом Струструп написал C++11 FAQ, потом это скопировали в википедию на 100 языках,

A>а потом набежала толпа ленивых нубов, и они начали задавать вопросы, ответы на которые написаны в википедии/FAQ
RSDN ценен контентом, а не ответами в стиле "ищи в гугле". Жаль, что ты этого не понимаешь
Re[4]: хитрая конструкция
От: Lonely Dog Россия  
Дата: 10.03.15 11:02
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Lonely Dog, Вы писали:


LD>>А может ты перестанешь посылать людей читать книжку?

X>нэд.
Печалька
Ну да ничего, может пройдет со временем
Re[5]: хитрая конструкция
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.03.15 11:29
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Печалька

да нет же, все супер!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[15]: хитрая конструкция
От: Lonely Dog Россия  
Дата: 10.03.15 11:31
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Lonely Dog, Вы писали:


LD>>RSDN ценен контентом, а не ответами в стиле "ищи в гугле". Жаль, что ты этого не понимаешь

X>понимать это должны те, кто с этого что-то получает
X>мне, и еще многим, на rsdn просто нас****, ибо выбор огромен
Я редко что-то спрашиваю на RSDN, но часто попадаются интересные дискуссии. Даже на тривиальные вопросы . Т.ч. да, я получаю.

Но дело в не том, не понимаю людей, которые не поленились и ответили в стиле "иди, читай книжки"
Re[14]: хитрая конструкция
От: Abyx Россия  
Дата: 10.03.15 12:04
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>>>А в гугле/яндексе как эта информация появилась? Кто-то спросил, ему ответили. Почему нельзя спрашивать здесь?


A>>нет, начала написали пропозалы, потом Струструп написал C++11 FAQ, потом это скопировали в википедию на 100 языках,

A>>а потом набежала толпа ленивых нубов, и они начали задавать вопросы, ответы на которые написаны в википедии/FAQ
LD>RSDN ценен контентом, а не ответами в стиле "ищи в гугле". Жаль, что ты этого не понимаешь
контент ценен уникальностью, а копипаста или пересказ википедии — это плохой контент.
In Zen We Trust
Re[16]: хитрая конструкция
От: Abyx Россия  
Дата: 10.03.15 20:32
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Но дело в не том, не понимаю людей, которые не поленились и ответили в стиле "иди, читай книжки"


кто-то же должен был это написать
In Zen We Trust
Re[15]: хитрая конструкция
От: Lonely Dog Россия  
Дата: 11.03.15 05:56
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, Lonely Dog, Вы писали:


LD>>>>А в гугле/яндексе как эта информация появилась? Кто-то спросил, ему ответили. Почему нельзя спрашивать здесь?


A>>>нет, начала написали пропозалы, потом Струструп написал C++11 FAQ, потом это скопировали в википедию на 100 языках,

A>>>а потом набежала толпа ленивых нубов, и они начали задавать вопросы, ответы на которые написаны в википедии/FAQ
LD>>RSDN ценен контентом, а не ответами в стиле "ищи в гугле". Жаль, что ты этого не понимаешь
A>контент ценен уникальностью, а копипаста или пересказ википедии — это плохой контент.
Ничего подобного
Ты никогда не сталкивался с тем, что вот прочитал в одной книжке, понял не все. Потом прочитал в другой (другое изложение), понял. Так и здесь, один человек будет использовать одни примеры, другой другие. Я понимаю потоки в Windows (примитивы синхронизации, API и пр), кто-то другой знает Posix API (pthreads). Соответственно при ответе на один и тот же вопрос (про потоки где-нибудь еще) я буду использовать примеры из своей области знаний, другой человек из своей.
Re[17]: хитрая конструкция
От: Lonely Dog Россия  
Дата: 11.03.15 05:58
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, Lonely Dog, Вы писали:


LD>>Но дело в не том, не понимаю людей, которые не поленились и ответили в стиле "иди, читай книжки"


A>кто-то же должен был это написать

Зачем? Мне кажется, бесполезно воспитывать людей. Если кому-то удобно спросить здесь, пускай спрашивает. Всегда найдется тот, кому захочется ответить на практически на любой вопрос. 10 лет назад (я на RSDN с 2002 года) отвечали почти на все. Кроме разве что вопросов от студентов (в стиле, напишите мне лабу .
Re[12]: хитрая конструкция
От: andy1618 Россия  
Дата: 11.03.15 07:07
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Вообще странно, раньше RSDN был более дружественным, счас народ изменился


В данном случае, я думаю, причина другая.
Как кто-то сказал, "резкость в высказываниях — удел молодости"
Re[17]: хитрая конструкция
От: x-code  
Дата: 11.03.15 07:16
Оценка:
Здравствуйте, Abyx, Вы писали:

LD>>Но дело в не том, не понимаю людей, которые не поленились и ответили в стиле "иди, читай книжки"

A>кто-то же должен был это написать

А высшее образование вы тоже чисто по книжкам по книжкам получали?
На самом деле завидую если так — это редкий дар. Обычно людям, чтобы чему-то научитсья, нужно ходить на лекции, конспектировать, спрашивать у преподов уточняющие вопросы, ходить на практические занятия, смотреть как сделаны лабы у товарищей, обсуждать с ними это, затем переписывать конспекты на шпаргалки, сдавать экзамены, возвращаться к пройденному материалу из других курсов, участвовать в реальных проектах...

В общем, книжки это хорошо, но недостаточно.
Вопрос про данную хитрую конструкцию вполне достойный. Я понимаю, если бы спросили как работает оператор if, или, простихосподи, goto. Или просили бы написать лабу в стиле "ввести два числа, вывести сумму двух чисел". Но тут — какая-то хитровывернутая конструкция из малоизвестных, экзотических и только-что появившихся возможностей С++. Я медитирую над этой хренью с начала появления темы и не понимаю как она работает Хотя с простыми примерами по variadic templates вроде все понятно.
Ну вот как она умудряется распространить вызов функции f на каждый элемент пакета параметров?
Re[13]: хитрая конструкция
От: Lonely Dog Россия  
Дата: 11.03.15 07:55
Оценка:
Здравствуйте, andy1618, Вы писали:

A>Здравствуйте, Lonely Dog, Вы писали:


LD>>Вообще странно, раньше RSDN был более дружественным, счас народ изменился


A>В данном случае, я думаю, причина другая.

A>Как кто-то сказал, "резкость в высказываниях — удел молодости"
Да, тоже об этом подумал .
Re[18]: хитрая конструкция
От: Abyx Россия  
Дата: 11.03.15 11:25
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Ну вот как она умудряется распространить вызов функции f на каждый элемент пакета параметров?


по определению.

14.5.3[temp.variadic]
4 A pack expansion consists of a pattern and an ellipsis, the instantiation of which produces zero or more instantiations of the pattern in a list (described below).
[...]
7 The instantiation of a pack expansion [...] produces a list E1, E2, ..., EN, where N is the number of elements in the pack expansion parameters. Each Ei is generated by instantiating the pattern and replacing each pack expansion parameter with its ith element.


есть паттерн, он копируется для каждого элемента пака. просто же
In Zen We Trust
Re[19]: хитрая конструкция
От: DarkEld3r  
Дата: 11.03.15 13:17
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD> У меня тупо нет времени изучать новые возможности C++. Узнаю про них из таких вот постов.

На посты-то время находится... А в книжке концентрация полезной информации, как правило, больше.
Re[20]: хитрая конструкция
От: Lonely Dog Россия  
Дата: 11.03.15 15:44
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>Здравствуйте, Lonely Dog, Вы писали:


LD>> У меня тупо нет времени изучать новые возможности C++. Узнаю про них из таких вот постов.

DE>На посты-то время находится... А в книжке концентрация полезной информации, как правило, больше.
Ну одно дело раз в день пробежаться по заголовкам, выбрать пару интересных. Другое дело читать книжки. Мне как бы база не сильно интересна, да и в книжках не все пишут, только основные вещи.
Re[6]: хитрая конструкция
От: Erop Россия  
Дата: 16.03.15 10:35
Оценка:
Здравствуйте, Nikе, Вы писали:

N>Как бы да. Просто сначала появилась версия, что такая форма как-то позволяет специфицировать порядок вызовов. Иначе совсем непонятно — зачем она нужна.

Ну параллелить, например, удобно автоматом...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.