2011-04-05 30 views
1

为什么我不能叫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) 

当我运行该代码preprocesson我得到如下:

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); 

如何实现这一目标?

+1

宏替换是非递归的,这就是为什么这是行不通的。如果你需要多层嵌套,你可以考虑在第二层使用'BOOST_PP_SEQ_FOR_EACH_I'(忽略计数器)。 – 2011-12-31 07:01:21

回答

2

不幸的是,我想这只能用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))