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