【问题标题】:How to use boost::preprocessor to unzip a sequence?如何使用 boost::preprocessor 解压缩序列?
【发布时间】:2014-12-16 00:20:18
【问题描述】:

如何使用 boost::preprocessor 解压一系列pair?

例如,我有一个如下的序列(逗号之间没有关系)

(int,x)(double,y)(float,z) or
(int,x),(double,y),(float,z) or
((int)(x))((double)(y))((float)(z))

想要转换成

int,double,float

x,y,z

通过使用 macor like

UNZIP(i, seq) 

其中i 是索引。

【问题讨论】:

  • 最后两个元素之间有逗号,前两个元素之间没有逗号。你喜欢哪个?实际上,用逗号看起来好多了。

标签: c++ boost boost-preprocessor


【解决方案1】:

解压(int, x, 10)(double, y, 20)(float, z, 30),即元素之间没有逗号的序列。

LIVE DEMO

#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/seq/pop_front.hpp>
#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/preprocessor/cat.hpp>

// Such technique is used at:
//   http://www.boost.org/doc/libs/1_56_0/boost/fusion/adapted/struct/define_struct.hpp
#define AUXILIARY_0(...) ((__VA_ARGS__)) AUXILIARY_1
#define AUXILIARY_1(...) ((__VA_ARGS__)) AUXILIARY_0
#define AUXILIARY_0_END
#define AUXILIARY_1_END

#define REMOVE_PARENTHESES(...) __VA_ARGS__

#define COMMA_SEPARATED(r, data, i, elem) \
    BOOST_PP_COMMA_IF(i) BOOST_PP_VARIADIC_ELEM(data, REMOVE_PARENTHESES elem) \
/**/

#define ZIPPED_TO_SEQ(zipped) \
    BOOST_PP_SEQ_POP_FRONT(BOOST_PP_CAT(AUXILIARY_0(0)zipped,_END)) \
/**/

#define FOR_EACH_ZIPPED_I(macro, data, zipped) \
    BOOST_PP_SEQ_FOR_EACH_I(macro, data, ZIPPED_TO_SEQ(zipped)) \
/**/

#define UNZIP(i, zipped) FOR_EACH_ZIPPED_I(COMMA_SEPARATED, i, zipped)

/*******************************************************************/
// DEMO:

#define zipped (int, x, 10)(double, y, 20)(float, z, 30)

FIRST:  UNZIP(0, zipped)
SECOND: UNZIP(1, zipped)
THIRD:  UNZIP(2, zipped)

预处理器输出:

FIRST: int , double , float
SECOND: x , y , z
THIRD: 10 , 20 , 30

【讨论】:

    【解决方案2】:

    假设您的意思是逗号 ((int,x),(double,y),(float,z)),Boost.PP 效果很好:

    #include <boost/preprocessor.hpp> //or smaller individual headers
    
    //SEQ_ENUM adds commas between each element of the sequence
    //the sequence is transformed from what's passed into the ...
    //the invocation of UNZIP_MACRO is given the index to use in each element as data
    #define UNZIP(i, ...)                             \
        BOOST_PP_SEQ_ENUM(                            \
            BOOST_PP_SEQ_TRANSFORM(                   \
                UNZIP_MACRO,                          \
                i,                                    \
                BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__) \
            )                                         \
        )
    
    //called with each element of the sequence
    #define UNZIP_MACRO(s, data, elem) \
        BOOST_PP_TUPLE_ELEM(data, elem)
    
    
    #define ZIPPED_SEQUENCE (int,x),(double,y),(float,z)
    
    UNZIP(0, ZIPPED_SEQUENCE) //int, double, float
    UNZIP(1, ZIPPED_SEQUENCE) //x, y, z
    

    【讨论】:

      猜你喜欢
      • 2017-02-07
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多