对于某些类,我们可以定义宏,它将显式模板专业化作为Boost序列化库中的以下示例:
#define BOOST_IS_BITWISE_SERIALIZABLE(T) \
namespace boost { \
namespace serialization { \
template<> \
struct is_bitwise_serializable< T > : mpl::true_ {}; \
}} \
/**/
这适用于BOOST_IS_BITWISE_SERIALIZABLE(MyClass<int>)
但是我想用以下不同的参数创建一个适用于部分特化的方便宏:
template<class T, class Enable>
struct is_bitwise_serializable< MyClassA<T, Enable> > : mpl::true_ {};
template<class T>
struct is_bitwise_serializable< MyClassB<T> > : mpl::true_ {};
template<int N>
struct is_bitwise_serializable< MyClassC<N> > : mpl::true_ {};
.....
我试图通过Boost PreProcessor文档解决此问题,但无法继续进行。是否有针对此的Boost PreProcessor解决方案?
答案 0 :(得分:2)
这是一个使用Boost.Preprocessor的解决方案。它建立在sequences的工作基础之上。
#include <boost/mpl/bool.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/arithmetic/sub.hpp>
#include <boost/preprocessor/seq/enum.hpp>
#include <boost/preprocessor/seq/transform.hpp>
#include <boost/preprocessor/seq/size.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
#define PARAM_NAME param
#define PARAM(Index) BOOST_PP_CAT(PARAM_NAME, Index)
#define PARAM_DESCRIPTION(Index, Data, ParamType) \
ParamType PARAM(BOOST_PP_SUB(Index, 2))
#define IS_BITWISE_SERIALIZABLE(TemplateClass, Params) \
template \
< \
BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(PARAM_DESCRIPTION,, Params)) \
> \
struct is_bitwise_serializable \
< \
TemplateClass \
< \
BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(Params), PARAM_NAME) \
> \
> \
: boost::mpl::true_ {};
使用示例:
template <class T, class Enable>
struct MyClassA{};
template <class T>
struct MyClassB{};
template <int N>
struct MyClassC{};
template <class T, template <class> class Base = MyClassB>
struct MyClassD : public Base<T>{};
IS_BITWISE_SERIALIZABLE(MyClassA, (class)(class))
IS_BITWISE_SERIALIZABLE(MyClassB, (class))
IS_BITWISE_SERIALIZABLE(MyClassC, (int))
IS_BITWISE_SERIALIZABLE(MyClassD, (class)(template <class> class))
请参阅live example。