如何仅使用宏生成整数序列? 我们知道,C++具有 STD::MaMaGuiGeGeLySO序列< /代码>,它可以用来生成整数序列: STD::MaMaIONIXXY序列= >代码>(0,…,N-1)< /C> > /P>

如何仅使用宏生成整数序列? 我们知道,C++具有 STD::MaMaGuiGeGeLySO序列< /代码>,它可以用来生成整数序列: STD::MaMaIONIXXY序列= >代码>(0,…,N-1)< /C> > /P>,c++,boost,macros,preprocessor,C++,Boost,Macros,Preprocessor,我希望有一个宏MAKE\u INTEGER\u SEQUENCE(N)和MAKE\u INTEGER\u SEQUENCE(3)将返回(0)(1)(2) 我们如何仅用宏实现它?也欢迎使用boost.preprocesser解决方案 我试过使用宏(r,数据,I,元素)(I) 此宏是一个重复构造。如果seq是(a)(b)(c),则扩展到以下顺序: 宏(r,数据,0,a)宏(r,数据,1,b)宏(r,数据,2,c) 但是我必须提供一个N-elems-seq(如上面的(a)(b)(c)),这对于这个特性

我希望有一个宏
MAKE\u INTEGER\u SEQUENCE(N)
MAKE\u INTEGER\u SEQUENCE(3)
将返回
(0)(1)(2)

我们如何仅用宏实现它?也欢迎使用boost.preprocesser解决方案

我试过使用宏(r,数据,I,元素)
(I)

此宏是一个重复构造。如果seq是(a)(b)(c),则扩展到以下顺序: 宏(r,数据,0,a)宏(r,数据,1,b)宏(r,数据,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>
            {};
        };
....
//上面是primiary模板,下面是specialize,代码来自libcxx:https://github.com/llvm-mirror/libcxx/blob/master/include/__tuple#L130
模板
结构奇偶校验
{
模板
结构pmake:重复
{};
};
模板
结构奇偶校验
{
模板
结构pmake:重复
{};
};
模板
结构奇偶校验
{
模板
结构pmake:重复
{};
};
模板
结构奇偶校验
{
模板
结构pmake
:重复
{};
};
....

因此,宏是这里唯一的选择

您可以使用()轻松完成此操作:

#包括
#定义如下要素(z,n,数据)(n)
#定义MAKE_INTEGER_SEQUENCE(n)BOOST_PP_REPEAT(n,TO SEQ_ELEM,)
生成整数序列(10)/(0)(1)(2)(3)(4)(5)(6)(7)(8)(9)

请注意,有一个重复限制,
BOOST\u PP\u limit\u REPEAT
,在我测试它时是256,因此这是
n

的最大可能值。您是否升级到了C++17?@TEDLYNMO C++17/20功能也受欢迎。但是,iirc,新功能与宏无关。也许不是,但是。。。宏观解决方案(不管是什么)是最优的吗?你在什么情况下想要这个?依我看,这是一个更好的选择。因为我需要很多类似的代码依赖于序列,所以我上面粘贴的只是其中的一小部分。宏是这里唯一的选择-->恰恰相反,这是模板的一些标准任务,您只需要一些像样的元编程库,您也可以为这些例程编写自己的工具。
#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)