gpt4 book ai didi

必要时插入类型名称的 C++ 宏

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:48 27 4
gpt4 key购买 nike

我有一个宏,用于对具有继承构造函数的模板进行自动子类型化,如下所示:

#define INST_TMPL(NAME,TMPL,...)  \
struct NAME : public TMPL<__VA_ARGS__> { \
typedef TMPL<__VA_ARGS__> Base;\
using Base::Base;\ // Inherit constructors
};

请不要争论这样的宏是否必要或良好的风格。对我们的项目很有帮助;我们用它来缩短非常长的模板的类型名称。例如,我们可以将模板名称缩短为 LongName<int,float,x::y::LongInnerType>通过使用 INST_TMPL(MyType,LongName,int,float,x::y::LongInnerType) .现在我们可以简单地使用 MyType而不是长模板,类型也将显示在错误消息中(而不是扩展模板名称)。

但现在有一个问题:根据使用的模板,我们有时需要 typenametypedef宏里面。例如,如果使用的模板是模板参数 T 的内部模板,例如T::LongName<...> , 那么我们需要 typename在 typedef 中,即:

   typedef typename TMPL<__VA_ARGS__> Base;\

当然,我可以创建两个宏,一个带有 typename和一个没有。然而,这是相当麻烦的。相反,我希望有一个在两种情况下都能正确编译的宏。这可能吗?

最佳答案

来自评论:

重写这里的方法 typename可以通过宏参数指定是使用一个辅助模板类,它只报告它自己的模板参数。

template <typename T>
struct id { typedef T type; };

#define INST_TMPL(NAME,...) \
struct NAME : id<__VA_ARGS__>::type { \
typedef typename id<__VA_ARGS__>::type Base; \
using Base::Base; \
};

INST_IMPL(MyType,LongName<int,float,x::y::LongInnerType>)一样使用它,或喜欢 INST_IMPL(MyType,typename T::LongName<int,float,x::y::LongInnerType>) .

typename id<...>::type的使用即使这是非依赖类型也是允许的。

关于必要时插入类型名称的 C++ 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26233807/

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