首页 > 解决方案 > 如何仅使用宏生成整数序列?

问题描述

众所周知,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.preprocessor 解决方案也欢迎!

我试过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>
            {};
        };
....

所以,宏是这里唯一的选择

标签: c++boostmacrospreprocessor

解决方案


您可以使用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


推荐阅读