【问题标题】:Nested boost (preprocessor) sequence嵌套提升(预处理器)序列
【发布时间】:2011-04-05 08:14:19
【问题描述】:

为什么我不能从这样的宏内部调用 BOOST_PP_SEQ_FOR_EACH:

#define MAP_KEY_TYPES (int)(double)(std::string)
#define MAP_VAL_TYPES (int)(double)(std::string)(std::vector<int>)

#define DECLARE_MAP_VARIANTS(r, K, V) \
    void toJson(        Json::Value &j, const std::map< K, V >& v);\
    void fromJson(const Json::Value &j,       std::map< K, V >& v);

#define DECLARE_MAP_VARIANTS_KEY(r, data, K) \
    BOOST_PP_SEQ_FOR_EACH(DECLARE_MAP_VARIANTS, K, MAP_VAL_TYPES)

    BOOST_PP_SEQ_FOR_EACH(DECLARE_MAP_VARIANTS_KEY, _, MAP_KEY_TYPES)

当我在这段代码上运行预处理时,我得到以下信息:

BOOST_PP_SEQ_FOR_EACH(DECLARE_MAP_VARIANTS, int, (int)(double)(std::string)(std::vector<int>))
BOOST_PP_SEQ_FOR_EACH(DECLARE_MAP_VARIANTS, double, (int)(double)(std::string)(std::vector<int>))
BOOST_PP_SEQ_FOR_EACH(DECLARE_MAP_VARIANTS, std::string, (int)(double)(std::string)(std::vector<int>))

我想看到的是:

void toJson(        Json::Value &j, const std::map< int,         int >& v);
void fromJson(const Json::Value &j,       std::map< int,         int >& v);
void toJson(        Json::Value &j, const std::map< double,      int >& v);
void fromJson(const Json::Value &j,       std::map< double,      int >& v);
void toJson(        Json::Value &j, const std::map< std::string, int >& v);
void fromJson(const Json::Value &j,       std::map< std::string, int >& v);

void toJson(        Json::Value &j, const std::map< int,         double >& v);
void fromJson(const Json::Value &j,       std::map< int,         double >& v);
void toJson(        Json::Value &j, const std::map< double,      double >& v);
void fromJson(const Json::Value &j,       std::map< double,      double >& v);
void toJson(        Json::Value &j, const std::map< std::string, double >& v);
void fromJson(const Json::Value &j,       std::map< std::string, double >& v);

void toJson(        Json::Value &j, const std::map< int,         std::string >& v);
void fromJson(const Json::Value &j,       std::map< int,         std::string >& v);
void toJson(        Json::Value &j, const std::map< double,      std::string >& v);
void fromJson(const Json::Value &j,       std::map< double,      std::string >& v);
void toJson(        Json::Value &j, const std::map< std::string, std::string >& v);
void fromJson(const Json::Value &j,       std::map< std::string, std::string >& v);

void toJson(        Json::Value &j, const std::map< int,         std::vector<std::string> >& v);
void fromJson(const Json::Value &j,       std::map< int,         std::vector<std::string> >& v);
void toJson(        Json::Value &j, const std::map< double,      std::vector<std::string> >& v);
void fromJson(const Json::Value &j,       std::map< double,      std::vector<std::string> >& v);
void toJson(        Json::Value &j, const std::map< std::string, std::vector<std::string> >& v);
void fromJson(const Json::Value &j,       std::map< std::string, std::vector<std::string> >& v);

如何做到这一点?

【问题讨论】:

  • 宏替换是非递归的,这就是为什么这不起作用。如果需要多层嵌套,可以考虑使用BOOST_PP_SEQ_FOR_EACH_I作为第二层(不考虑计数器)。

标签: c++ boost c-preprocessor


【解决方案1】:

不幸的是,我想这不能仅使用BOOST_PP_SEQ_FOR_EACH 完成。 如果改为允许BOOST_PP_SEQ_FOR_EACH_PRODUCT,则可能 以下宏将达到目的:

#define DECLARE_MAP_VARIANTS_(r, KV) \
    DECLARE_MAP_VARIANTS(r, BOOST_PP_SEQ_ELEM(0, KV), BOOST_PP_SEQ_ELEM(1, KV))

BOOST_PP_SEQ_FOR_EACH_PRODUCT(
    DECLARE_MAP_VARIANTS_, (MAP_KEY_TYPES)(MAP_VAL_TYPES) )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-03
    • 2015-03-29
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多