Сообщение Re: Предпочтительный способ вычислений во времени компиляции от 13.09.2019 6:50
Изменено 13.09.2019 7:08 rg45
Re: Предпочтительный способ вычислений во времени компиляции
Здравствуйте, sergii.p, Вы писали:
SP>собственно в C++, есть два способа делать одно и то же.
SP>
SP>Вроде выбор напрашивается. Надо предпочитать constexpr функции. Но если смотреть реализации stl, то получается многие идут по первому пути (н-р реализация наибольшего общего делителя _gcd из std::ratio для gcc и msvc). Значит есть какие-то проблемы с constexpr подходом. Так вот какие?
Ничего не имею против функций, но вариант реализации на шаблонах структур тоже имеет право на жизнь, я считаю. Причем необходимось в шаблонной рекусии отпала во многих случаях после появления variadic templates и fold expressions:
http://coliru.stacked-crooked.com/a/1f217aa952e79f57
SP>собственно в C++, есть два способа делать одно и то же.
SP>
SP>Вроде выбор напрашивается. Надо предпочитать constexpr функции. Но если смотреть реализации stl, то получается многие идут по первому пути (н-р реализация наибольшего общего делителя _gcd из std::ratio для gcc и msvc). Значит есть какие-то проблемы с constexpr подходом. Так вот какие?
Ничего не имею против функций, но вариант реализации на шаблонах структур тоже имеет право на жизнь, я считаю. Причем необходимось в шаблонной рекусии отпала во многих случаях после появления variadic templates и fold expressions:
http://coliru.stacked-crooked.com/a/1f217aa952e79f57
template <size_t N, typename = std::make_index_sequence<N+1>>
struct Factorial;
template <size_t N, size_t...V>
struct Factorial<N, std::index_sequence<0, V...>> : std::integral_constant<size_t, (1 * ... * V)> {};
int main()
{
std::cout << Factorial<5>::value << std::endl;
}
Re: Предпочтительный способ вычислений во времени компиляции
Здравствуйте, sergii.p, Вы писали:
SP>собственно в C++, есть два способа делать одно и то же.
SP>
SP>Вроде выбор напрашивается. Надо предпочитать constexpr функции. Но если смотреть реализации stl, то получается многие идут по первому пути (н-р реализация наибольшего общего делителя _gcd из std::ratio для gcc и msvc). Значит есть какие-то проблемы с constexpr подходом. Так вот какие?
Ничего не имею против функций, но вариант реализации на шаблонах структур тоже имеет право на жизнь, я считаю. Причем необходимось в шаблонной рекусии отпала во многих случаях после появления variadic templates и fold expressions:
http://coliru.stacked-crooked.com/a/1f217aa952e79f57
SP>собственно в C++, есть два способа делать одно и то же.
SP>
SP>Вроде выбор напрашивается. Надо предпочитать constexpr функции. Но если смотреть реализации stl, то получается многие идут по первому пути (н-р реализация наибольшего общего делителя _gcd из std::ratio для gcc и msvc). Значит есть какие-то проблемы с constexpr подходом. Так вот какие?
Ничего не имею против функций, но вариант реализации на шаблонах структур тоже имеет право на жизнь, я считаю. Причем необходимось в шаблонной рекусии отпала во многих случаях после появления variadic templates и fold expressions:
http://coliru.stacked-crooked.com/a/1f217aa952e79f57
template <size_t N, typename = std::make_index_sequence<N+1>>
struct Factorial;
template <size_t N, size_t...V>
struct Factorial<N, std::index_sequence<0, V...>> : std::integral_constant<size_t, (1 * ... * V)> {};
int main()
{
std::cout << Factorial<0>::value << std::endl;
std::cout << Factorial<1>::value << std::endl;
std::cout << Factorial<2>::value << std::endl;
std::cout << Factorial<3>::value << std::endl;
std::cout << Factorial<4>::value << std::endl;
std::cout << Factorial<5>::value << std::endl;
}