目标:
我想用预处理技术声明以下类集合(简化示例):
template <typename A>
class MyClassName_0
{
private:
};
template <typename A, typename X0>
class MyClassName_1
{
private:
X0 const& x0;
};
template <typename A, typename X0, typename X1>
class MyClassName_2
{
private:
X0 const& x0;
X1 const& x1;
};
/* ... */
template <typename A, typename X0, typename X1, /* ... */ typename X99>
class MyClassName_100
{
private:
X0 const& x0;
X1 const& x1;
/* ... */
X99 const& x99;
};
我做了什么:
我通过这种方式定义了一个模板类:
#define MAKE_MYCLASSNAME_DECLARATION(z, n, data) \
template <typename A BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, typename X)> \
class MyClassName_ ## n \
{ \
};
然后我可以枚举这些类:
#define MAKE_MYCLASSNAME_DECLARATIONS(n) BOOST_PP_REPEAT(BOOST_PP_INC(n), MAKE_MYCLASSNAME_DECLARATION, 0)
MAKE_MYCLASSNAME_DECLARATIONS(100)
我的问题:
我不知道如何使用boost 编写私人成员。是否有一个类似于BOOST_PP_ENUM_BINARY_PARAMS
的神奇函数,但是用分号作为分隔符?
我的解决方案:
我知道我可以自己写这个宏。实际上很简单:
#define MAKE_MYCLASSNAME_PRIVATE_DECLARATION(z, n, data) \
X ## n const& x ## n;
#define MAKE_MYCLASSNAME_PRIVATE_DECLARATIONS(n) BOOST_PP_REPEAT(n, MAKE_MYCLASSNAME_PRIVATE_DECLARATION, 0)
然后通过以下方式调用它:
#define MAKE_MYCLASSNAME_DECLARATION(z, n, data) \
template <typename A BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, typename X)> \
class MyClassName_ ## n \
{ \
private: \
MAKE_MYCLASSNAME_PRIVATE_DECLARATIONS(n)
};
但我想知道我是否只能做类似的事情:
#define MAKE_MYCLASSNAME_DECLARATION(z, n, data) \
template <typename A BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, typename X)> \
class MyClassName_ ## n \
{ \
private: \
BOOST_PP_ENUM_BINARY_PARAMS(n, X, const& x)
};