Повышение. Препроцессор: BOOST_PP_TUPLE_ELEM и BOOST_PP_SEQ_ELEM - PullRequest
1 голос
/ 29 августа 2011

Моя проблема лучше всего описана с кодом:

#include <boost/preprocessor.hpp>
#include <iostream>

#define SEQ (1, 2)(3, 4)

int main() {
    // this does not compile:
    // std::cout << BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_SEQ_ELEM(0, SEQ)) << std::endl;

    // this compiles with warning C4002: too many actual parameters for macro 'BOOST_PP_SEQ_ELEM_0'
    std::cout << BOOST_PP_SEQ_ELEM(0, SEQ) << std::endl;

    // Output: 1
    // Expected output: None, since it shouldn't compile cout << (1, 2) << std::endl
}

Что я делаю не так?


Хм, спасибо

#define SEQ ((1, 2))((3, 4))
// ...
std::cout << BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_SEQ_ELEM(0, SEQ)) << std::endl;
std::cout << BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_SEQ_ELEM(0, SEQ)) << std::endl;
std::cout << BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_SEQ_ELEM(1, SEQ)) << std::endl;
std::cout << BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_SEQ_ELEM(1, SEQ)) << std::endl;

Выход:

1
2
3
4

Что правильно. Но это не решает мою проблему, потому что я хочу использовать последовательность с BOOST_FUSION_DEFINE_STRUCT, что означает, что я не могу использовать дополнительные скобки. Я хочу сделать что-то вроде этого:

#define DEFINE_MY_FANCY_STRUCT(NAMESPACE_SEQ, NAME, ATTRIBUTES) \
    BOOST_FUSION_DEFINE_STRUCT(NAMESPACE_SEQ, NAME, ATTRIBUTES) \
    \
    // other boilerplate code here, i.e. serialization with BOOST_SERIALIZATION_NVP or generation of spirit parsers

1 Ответ

0 голосов
/ 29 августа 2011

Попробуйте это:

#define SEQ ((1, 2))((3, 4))

Выходные данные должны быть 2, поскольку результат (1, 2) равен 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...