Здравствуйте, kov_serg, Вы писали:
_>Как получить медиану из списка с помощью таких "трюков" ?
1) зачем?
2) как минимум можно скомбинировать: берёшь рецепт взятия n-го элемента и подставляешь в него n = sizeof...(ts) / 2;
Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, kov_serg, Вы писали:
_>>Как получить медиану из списка с помощью таких "трюков" ? W>1) зачем?
Вот именно. Нафига все эти трюки если всю подготовитеьлную работу можно выполнить до компиляции. Без "трюков", используя вменяемые языки программирования. W>2) как минимум можно скомбинировать: берёшь рецепт взятия n-го элемента и подставляешь в него n = sizeof...(ts) / 2;
И где?
Пардон, но это же жульничество. Если ts — это variadic pack, то не скомпилируется первый вариант, а если нет, то второй. Эти варианты НЕ взаимозаменяемы. Ну либо я недопонял глубины иносказательности.
P.S. А все остальное, что есть по ссылке — какая-то банальщина.
--
Не можешь достичь желаемого — пожелай достигнутого.
_NN>template <typename Pred, typename F, typename... Ts>
_NN>void call_if_not_predicate_v(Pred pred, F f, Ts... ts)
_NN>{
_NN> for (auto v : {ts...})
_NN> {
_NN> if (pred(v))
_NN> break;
_NN> f(v);
_NN> }
_NN>}
_NN>
Ну вот лично мне такая функция кажется притянутой за уши. Почему бы сразу не принять параметры в виде initializer_list? Вариадик паки же, до появления фолд экспрешенов, естественнее было бы обработать рекурсией. Циклы востребованы при работе с последовательностями элементов одного типа, чей размер не известен во время компиляции. В то время как фолд экспрешены наоборот — для последовательностей элементов разных типов и с размером, известным во время компиляции. Вот и выходит, что циклы и фолд экспрешены не конкуренты — в виду их разных областей применимости.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, _NN_, Вы писали:
_NN>>
_NN>>template <typename Pred, typename F, typename... Ts>
_NN>>void call_if_not_predicate_v(Pred pred, F f, Ts... ts)
_NN>>{
_NN>> for (auto v : {ts...})
_NN>> {
_NN>> if (pred(v))
_NN>> break;
_NN>> f(v);
_NN>> }
_NN>>}
_NN>>
R>Ну вот лично мне такая функция кажется притянутой за уши. Почему бы сразу не принять параметры в виде initializer_list? Вариадик паки же, до появления фолд экспрешенов, естественнее было бы обработать рекурсией. Циклы востребованы при работе с последовательностями элементов одного типа, чей размер не известен во время компиляции. В то время как фолд экспрешены наоборот — для последовательностей элементов разных типов и с размером, известным во время компиляции. Вот и выходит, что циклы и фолд экспрешены не конкуренты — в виду их разных областей применимости.
Проверенно на практике, компилятор гораздо охотнее оптимизирует линейный код из fold expression чем рекурсию.
К тому же есть возможность передать разные типы, а не только один как в случае с initializer_list.
Мы заменили рекурсивный код времён C++14 на fold expression и получили более быстрый код, а так же немаловажно, более быструю компиляцию.
_NN>>>template <typename Pred, typename F, typename... Ts>
_NN>>>void call_if_not_predicate_v(Pred pred, F f, Ts... ts)
_NN>>>{
_NN>>> for (auto v : {ts...})
_NN>>> {
_NN>>> if (pred(v))
_NN>>> break;
_NN>>> f(v);
_NN>>> }
_NN>>>}
_NN>>>
_NN>Проверенно на практике, компилятор гораздо охотнее оптимизирует линейный код из fold expression чем рекурсию.
Да кто же с этим спорит. Вопрос же в том, как выглядел код ДО этого. И вот оказывается, что тот код, который мы как бы улучшаем, полностью надуман.
_NN>К тому же есть возможность передать разные типы, а не только один как в случае с initializer_list.
Да как же ты передашь разные типы, если внутри функции все эти объекты все равно складываются в один initializer_list? У тебя это просто не скомпилируется.
_NN>Мы заменили рекурсивный код времён C++14 на fold expression и получили более быстрый код, а так же немаловажно, более быструю компиляцию.
Ну вот замена шаблонной рекурсии фолд экспрешенами — это хороший пример, тут я ничего против не имею. А вот замена циклов фолд экспрешенами притянута за уши. Данная статья создает иллюзию, что, благодаря фолд экспрешенам, мы теперь можем отказаться от использования циклов. В то время как таких мест в реальном коде, где такая замена возможна, найдется крайне мало, если найдется вообще.
P.S. Я против fold expressions ничего не имею, если что
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, _NN_, Вы писали:
_NN>Проверенно на практике, компилятор гораздо охотнее оптимизирует линейный код из fold expression чем рекурсию.
У меня компилятор gcc ругался на замыкающую рекурсию в constexpr функции. Пришлось отказаться, так что не всё так однозначно.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]