我们知道,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
}
因此,宏是唯一的选择
答案 0 :(得分:3)
您可以使用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
的最大可能值。