如何仅使用宏生成整数序列?

时间:2018-11-17 03:24:34

标签: c++ boost macros preprocessor

我们知道,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解决方案!

我已经尝试过macro(r, data, i, elem)(i) (a)(b)(c)

  

此宏是重复结构。如果seq为(a)(b)(c),它将扩展为以下序列:   macro(r,data,0,a)macro(r,data,1,b)macro(r,data,2,c)

但是我必须提供N个元素seq(例如上面的 ...... //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> {}; }; .... ),对于此功能来说,这是多余的。

我希望它成为宏的原因是我需要这样的序列才能生成多行代码,例如:

    override func viewDidAppear(_ animated: Bool){
        super.viewDidAppear(animated) 
        //google map setup here
    }

因此,宏是唯一的选择

1 个答案:

答案 0 :(得分:3)

您可以使用BOOST_PP_REPEATlive 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的最大可能值。