Информация об изменениях

Сообщение Re[2]: Предпочтительный способ вычислений во времени компиля от 12.09.2019 14:22

Изменено 12.09.2019 14:43 rg45

Re[2]: Предпочтительный способ вычислений во времени компиля
Здравствуйте, swingus, Вы писали:


S>Но экономней всего:


  Оригинальный пример
S>
S>#include <utility>
S>#include <iostream>

S>template <std::size_t Zero, std::size_t... Vals>
S>int constexpr fact_impl(std::index_sequence<Zero, Vals...>)
S>{
S>    return (... * Vals);
S>}


S>template <std::size_t Val>
S>int constexpr factorial() { return fact_impl(std::make_index_sequence<Val>{}); }

S>int main()
S>{    
S>    std::cout << factorial<5>() << "\n";
S>}
S>


S>


Только факториал пяти равен 120, а не 24 А попытка получить факториал от нуля и единицы у тебя приводит к ошибке компиляции.

Исправленная версия:

http://coliru.stacked-crooked.com/a/6c27e0cf39b312d0

template <std::size_t... Vals>
int constexpr fact_impl(std::index_sequence<Vals...>)
{
    return (1 * ... * (Vals + 1));
}

template <std::size_t Val>
int constexpr factorial() { return fact_impl(std::make_index_sequence<Val>{}); }
Re[2]: Предпочтительный способ вычислений во времени компиля
Здравствуйте, swingus, Вы писали:


S>Но экономней всего:


  Оригинальный пример
S>
S>#include <utility>
S>#include <iostream>

S>template <std::size_t Zero, std::size_t... Vals>
S>int constexpr fact_impl(std::index_sequence<Zero, Vals...>)
S>{
S>    return (... * Vals);
S>}


S>template <std::size_t Val>
S>int constexpr factorial() { return fact_impl(std::make_index_sequence<Val>{}); }

S>int main()
S>{    
S>    std::cout << factorial<5>() << "\n";
S>}
S>


S>


Только факториал пяти равен 120, а не 24 А попытка получить факториал от нуля и единицы у тебя приводит к ошибке компиляции.

Исправленная версия:

http://coliru.stacked-crooked.com/a/6c27e0cf39b312d0

template <std::size_t... Vals>
int constexpr fact_impl(std::index_sequence<Vals...>)
{
    return (1 * ... * (Vals + 1));
}

template <std::size_t Val>
int constexpr factorial() { return fact_impl(std::make_index_sequence<Val>{}); }


Можно чуть по-другому:

http://coliru.stacked-crooked.com/a/e3d5c43f5e52b7dc

template <std::size_t... Vals>
int constexpr fact_impl(std::index_sequence<0, Vals...>)
{
    return (1 * ... * Vals);
}

template <std::size_t Val>
int constexpr factorial() { return fact_impl(std::make_index_sequence<Val + 1>{}); }