2011-04-05 64 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))