Как мы знаем, c ++ имеет std::make_integer_sequence
, который можно использовать для генерации целочисленной последовательности: std::make_index_sequence<size_t, N>
=> (0, ..., N-1)
.
Я надеюсь, что есть макрос MAKE_INTEGER_SEQUENCE(N)
и MAKE_INTEGER_SEQUENCE(3)
вернет (0)(1)(2)
Как мы можем реализовать это только с помощью макроса? Решение boost.preprocesser также приветствуется!
Я пытался BOOST_PP_SEQ_FOR_EACH_I(macro, data, seq)
с macro(r, data, i, elem)
(i)
Этот макрос является конструкцией повторения. Если seq равен (a) (b) (c), он расширяется до последовательности:
macro (r, data, 0, a) macro (r, data, 1, b) macro (r, data, 2, c)
Но я должен предоставить N-elems seq (как (a)(b)(c)
выше), который довольно избыточен для этой функции.
Причина, по которой я надеюсь, что это макрос, в том, что мне нужны такие последовательности для генерации многострочных кодов, например:
...... //primiary template above, specialize below, codes are from libcxx: https://github.com/llvm-mirror/libcxx/blob/master/include/__tuple#L130
template<>
struct parity<0>
{
template<size_t Tp>
struct pmake : repeat<typename make<Tp / 8>::type>
{};
};
template<>
struct parity<1>
{
template<size_t Tp>
struct pmake : repeat<typename make<Tp / 8>::type, Tp - 1>
{};
};
template<>
struct parity<2>
{
template<size_t Tp>
struct pmake : repeat<typename make<Tp / 8>::type, Tp - 2, Tp - 1>
{};
};
template<>
struct parity<3>
{
template<size_t Tp>
struct pmake
: repeat<typename make<Tp / 8>::type, Tp - 3, Tp - 2, Tp - 1>
{};
};
....
так, макрос здесь единственный выбор