Как генерировать целочисленную последовательность только с макросом? - PullRequest
0 голосов
/ 17 ноября 2018

Как мы знаем, 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>
            {};
        };
....

так, макрос здесь единственный выбор

1 Ответ

0 голосов
/ 17 ноября 2018

Вы можете сделать это легко с помощью BOOST_PP_REPEAT ( живой пример ):

#include <boost/preprocessor.hpp>

#define TO_SEQ_ELEM(z, n, data) (n)
#define MAKE_INTEGER_SEQUENCE(n) BOOST_PP_REPEAT(n, TO_SEQ_ELEM, )

MAKE_INTEGER_SEQUENCE(10) // (0) (1) (2) (3) (4) (5) (6) (7) (8) (9)

Обратите внимание, что существует предел повторения, BOOST_PP_LIMIT_REPEAT, который был 256, когда я тестировал его, так что это максимально возможное значение для n.

...