(C++11) 可变模板序列打印

(C++11) Variadic template sequence printing

我得到了一个模板元编程挑战,即仅使用 C++11 标准打印出一系列 2 的幂的整数,我已经成功完成了:

#include <iostream>

template <size_t... Ns>
struct index_sequence
{
    static void print()
    {
        const size_t numbers[] = {Ns...};
        for (const auto& number : numbers)
        {
            std::cout << number << ", ";
        }
        std::cout << std::endl;
    }
};

//#include <cmath>

template <size_t Counter, size_t... Rest>
struct make_sequence_impl
{
    using type = typename make_sequence_impl<
        Counter - 1,
        static_cast<size_t>(1) << Counter, Rest...>::type;
};

template <size_t... Rest>
struct make_sequence_impl<0, Rest...>
{
    using type = index_sequence<static_cast<size_t>(1) << 0, Rest...>;
};

template <size_t T>
using make_sequence = typename make_sequence_impl<T>::type;

int main()
{
    make_sequence<N>::print();
}

假设 N 是 5,它会打印 1, 2, 4, 8, 16。

然而,我随后被要求做同样的事情,除了这次我必须以相反的顺序打印它们(即 16、8、4、2、1 表示 N = 5)。我完全被难住了,但我非常确定它只涉及对代码的轻微更改,我不知道如何更改。

如有任何帮助,我们将不胜感激。前几天接触到模板元编程

不确定这是否是最小的变化,但您可能 "push_back 而不是 ""push_front" 序列".

template <size_t Counter, size_t... Rest>
struct make_sequence_impl
{
    using type = typename make_sequence_impl<
        Counter - 1,
        Rest...,
        static_cast<size_t>(1) << Counter>::type;
};

template <size_t... Rest>
struct make_sequence_impl<0, Rest...>
{
    using type = index_sequence<Rest..., static_cast<size_t>(1) << 0>;
};

Demo

在我这边,我会模仿std::make_index_sequence0, 1, 2, .., N-1然后直接使用它:

emplate <size_t Counter, size_t... Rest>
struct make_sequence_impl
{
    using type = typename make_sequence_impl<
        Counter - 1,
        Counter,
        Rest...>::type;
};

template <size_t... Rest>
struct make_sequence_impl<0, Rest...>
{
    using type = index_sequence<0, Rest...>;
};

然后

template <std::size_t ... Is>
void print( index_sequence<Is...> )
{
    for (const auto& number : {Is...})
    {
        std::cout << number << ", ";
    }
    std::cout << std::endl;
}


template <std::size_t ... Is>
void print_pow2( index_sequence<Is...> )
{
    print(index_sequence<(1u << Is)...>{});
}

template <std::size_t ... Is>
void print_pow2_inv( index_sequence<Is...> )
{
    print(index_sequence<(1u << (sizeof...(Is) - 1 - Is))...>{});
}

Demo