【问题标题】:How to generate integer sequence with macro only?如何仅使用宏生成整数序列?
【发布时间】:2018-11-17 03:24:33
【问题描述】:

众所周知,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),它展开为序列: 宏(r, data, 0, a) 宏(r, data, 1, b) 宏(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++17了吗?
  • @TedLyngmo c++17/20 特性也受到欢迎。但是,iirc,新功能与宏无关。
  • 也许不是,但是……宏观解决方案(无论它可能是什么)是更好的解决方案吗?你是什​​么情况想要这个?
  • IMO,这是一个优越的。因为我有很多类似的代码依赖于序列,所以我上面粘贴的只是其中的一小部分。
  • 宏是这里唯一的选择 --> 恰恰相反,这是模板的一些标准任务,你只需要一些像样的元编程库,你也可以编写自己的这些例程的工具。 A simple solution with boost::hana.

标签: c++ boost macros preprocessor


【解决方案1】:

您可以使用BOOST_PP_REPEAT (live example) 轻松做到这一点:

#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 的最大可能值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 2020-01-27
    • 2016-10-08
    • 2015-10-29
    • 2010-09-23
    • 2017-09-02
    相关资源
    最近更新 更多