Я создал макрос, используя 3 условия (например, 8 в моем реальном случае):
#define FOO(A,B,C) \
BOOST_PP_IF(A, a1, a2) \
BOOST_PP_IF(B, b1, b2) \
BOOST_PP_IF(C, c1, c2)
Это работает, как я ожидаю.Теперь я хочу расширить все возможности:
FOO(0,0,0)
FOO(0,0,1)
FOO(0,1,0)
FOO(0,1,1)
FOO(1,0,0)
FOO(1,0,1)
FOO(1,1,0)
FOO(1,1,1)
Таким образом, я должен написать 8 строк.В моем реальном случае мне нужно написать 256 строк.
Как я могу сгенерировать его напрямую с помощью инструментов (препровождения) препроцессора?
Пример MCV с объявлением конструкторов aкласс Foo
близок к моей реальной проблеме:
#define WRITE_FOO(A,B,C) \
Foo(int a1 BOOST_PP_COMMA_IF(A) BOOST_PP_IF(A, int a2, BOOST_PP_EMPTY()),
double b1 BOOST_PP_COMMA_IF(B) BOOST_PP_IF(B, double b2, BOOST_PP_EMPTY()),
bool c1 BOOST_PP_COMMA_IF(C) BOOST_PP_IF(C, bool c2, BOOST_PP_EMPTY()));
Затем
class Foo {
public:
WRITE_FOO(0,0,0)
WRITE_FOO(0,0,1)
WRITE_FOO(0,1,0)
WRITE_FOO(0,1,1)
WRITE_FOO(1,0,0)
WRITE_FOO(1,0,1)
WRITE_FOO(1,1,0)
WRITE_FOO(1,1,1)
private:
int a_1;
int a_2;
double b_1;
double b_2;
bool c_1;
bool c_2;
};
расширен до
class Foo {
public:
Foo(int a1, double b1, bool c1);
Foo(int a1, double b1, bool c1, bool c2);
Foo(int a1, double b1, double b2, bool c1);
Foo(int a1, double b1, double b2, bool c1, bool c2);
Foo(int a1, int a2, double b1, bool c1);
Foo(int a1, int a2, double b1, bool c1, bool c2);
Foo(int a1, int a2, double b1, double b2, bool c1);
Foo(int a1, int a2, double b1, double b2, bool c1, bool c2);
private:
int a_1;
int a_2;
double b_1;
double b_2;
bool c_1;
bool c_2;
};
Реализация похожа на:
#define IMPLEMENT_FOO(A,B,C) \
Foo::Foo(int a1 BOOST_PP_COMMA_IF(A) BOOST_PP_IF(A, int a2, BOOST_PP_EMPTY()),
double b1 BOOST_PP_COMMA_IF(B) BOOST_PP_IF(B, double b2, BOOST_PP_EMPTY()),
bool c1 BOOST_PP_COMMA_IF(C) BOOST_PP_IF(C, bool c2, BOOST_PP_EMPTY())): \
a_1(a1), \
a_2(BOOST_PP_IF(A, a2, a1)), \
b_1(b1),
b_2(BOOST_PP_IF(B, b2, b1)), \
c_1(c1),
c_2(BOOST_PP_IF(C, c2, c1)) \
{}