使用带分号的BOOST_PP_ENUM_BINARY_PARAMS(或类似)作为分隔符

时间:2016-09-28 11:30:30

标签: c++ boost boost-preprocessor

目标:

我想用预处理技术声明以下类集合(简化示例):

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)
  };

0 个答案:

没有答案