Вложенная последовательность буста (препроцессора) - PullRequest
1 голос
/ 05 апреля 2011

Почему я не могу вызвать 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);

Как этого добиться?

1 Ответ

2 голосов
/ 05 апреля 2011

К сожалению, я полагаю, что это не может быть сделано только с 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) )
...