C++宏,必要时插入typename
C++ macro that inserts typename if necessary
我有一个宏,用于使用继承构造函数自动对模板进行子类型划分,如下所示:
#define INST_TMPL(NAME,TMPL,...)
struct NAME : public TMPL<__VA_ARGS__> {
typedef TMPL<__VA_ARGS__> Base;
using Base::Base; // Inherit constructors
};
请不要争论这样的宏是必要的还是好的风格。它对我们的项目很有帮助;我们使用它来缩短非常长的模板的类型名称。例如,我们可以使用INST_TMPL(MyType,LongName,int,float,x::y::LongInnerType)
来缩短模板LongName<int,float,x::y::LongInnerType>
的名称。现在我们可以简单地使用MyType
而不是长模板,并且类型也将显示在错误消息中(而不是扩展的模板名称)。
但现在有一个问题:根据使用的模板,我们有时需要在宏内的typedef
中使用typename
。例如,如果使用的模板是模板参数T
的内部模板,例如T::LongName<...>
,那么我们需要typedef中的typename
,即:
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++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 预处理器:插入结构名称中的前一个行号
- 在未初始化映射的情况下,将值插入到映射的映射中
- 如何在c++中只将键插入到bimap的一侧
- 如何将结构插入到集合中并打印集合的成员
- C++json插入数组
- Visual Studio 2019:插入多个C++风格的单行注释
- nlohmann-json将一个数组插入到另一个数组中
- 有效地使用std::unordered_map来插入或增加键的值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 正在插入动态数组
- 插入或删除时获取usb的dos_name
- 叮叮当当在修复时插入多个"覆盖"说明符
- 链表c++插入,所有情况都已检查,但没有任何工作
- 为什么返回类型中需要typename?C++
- 将重物插入std::map
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 在数字之间插入 + 或 - 符号以使其等于整数
- C++宏,必要时插入typename