c++ - 如何仅使用宏生成整数序列?
问题描述
众所周知,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>
{};
};
....
所以,宏是这里唯一的选择
解决方案
您可以使用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
。
推荐阅读
- spring - Spring按需创建Prototype Bean并引用后面创建的bean
- python - 从烧瓶服务发出异步 HTTP 请求
- applescript - 如何使用 Applescript 删除空文件夹?
- perl - 获取 Par::Packer 的所有依赖项?
- java - 创建一个新的数组对象会导致出现几个错误
- progressive-web-apps - 如何在渐进式网络应用程序中进行定期后台同步?
- docker - 使用应用程序负载均衡器连接到 Rancher 上的 Docker 容器的纯 IPv6 客户端?
- arm - stm32f103:强制 DMA 传输完成中断
- events - DDD 使用 NoSQL 在有界上下文中处理多个聚合的最终一致性
- java - cassandra 在字段中存储“z”(在我的情况下这是错误的日期格式)