【发布时间】: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