Я пытаюсь поиграть с метапрограммированием шаблонов, constexpr и if constexpr, и придумал 3 разных способа выполнения N-рекурсивной/N-факторной операции.
Все три примера я нашел здесь на SO или в результате поиска в сети, а затем изменил их, чтобы они делали то же самое
В первом примере используется метапрограммирование шаблонов: пример 1
template<int N>
struct NGenerator
{
static const int result = N + NGenerator<N-1>::result;
};
template<>
struct NGenerator<0>
{
static const int result = 1;
};
static int example1 = NGenerator<5>::result;
Второй все еще использует шаблон, но я добавил constexpr: пример 2
template<int N>
constexpr int example2()
{
return N + example2<N - 1>();
}
template<>
constexpr int example2<0>()
{
return 1;
}
static int ex2 = example2<5>();
В третьем я удалил шаблон и использовал «только» constexpr: пример 3
constexpr int generator(int n)
{
return (n <= 1) ? 1 : n + generator(n - 1);
}
static int ex3 = generator(5);
На мой взгляд, все три делают то же самое - когда входное число является константой времени компиляции. Все три рекурсивны, все три работают во время компиляции.
Мой вопрос: в чем разница между тремя? Какой из них наиболее предпочтителен?
И, наконец, я хотел бы реализовать "if constexpr", но не смог, поэтому мой обходной путь состоял в том, чтобы сделать "if-statement" в примере 3, что на самом деле не так. истинное выражение if, но самое близкое, что я мог бы получить во время компиляции if - если это каким-либо образом то же самое, в чем я не уверен.
nm
иobjdump
, могут оказаться полезными. - person Jesper Juhl   schedule 29.12.2019+
вместо*
. - person Jarod42   schedule 29.12.2019