gpt4 book ai didi

c++ - 用于对类进行不同的部分特化的 Varadiac 宏

转载 作者:行者123 更新时间:2023-11-30 04:04:05 25 4
gpt4 key购买 nike

对于某些类,我们可以定义宏来进行显式模板特化,如下面来自 Boost Serialization 库的示例:

#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 解决方案?

最佳答案

这是一个使用 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 .

关于c++ - 用于对类进行不同的部分特化的 Varadiac 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23946669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com