c++ - 可以在独立于类模板的类中进行“使用”吗?
问题描述
如果我在类或结构中使用typedef
or using
,有时我希望它独立于用于该类或结构的模板。
在下面的示例中,我将使用Object<T>::RefCountT
,它会起作用,但我宁愿Object::RefCountT
在这种情况下使用类似的东西,因为这样我就不必随意选择一种类型(阅读时可能会造成混淆)。
template <typename T>
struct Object {
using RefCountT = unsigned short; // This is independent of T
};
对我来说,明显(但不理想)的解决方案是在课堂之外定义它,比如
using ObjectRefCountT = unsigned short;
我还尝试在没有模板的情况下进行重新定义,假设它们不会被认为是相同的,但这会导致有关重新定义的预期错误。
我假设因为它是一个类而不是一个函数,所以我不能隐式地做到这一点,编译器怎么知道它在这里无关紧要?
解决方案
Object
只是一个模板,但您需要实例化它才能访问其成员别名。我看到几个选项:
A) 不要RefCountT
成为Object
.
B)提供默认参数,因此您无需显式选择类型来访问别名:
template <typename T = void>
struct Object {
using RefCountT = unsigned short; // This is independent of T
};
然后
Object<>::RefCount x;
C) 为所有实例使用一个通用基类:
struct ObjectBase {
using RefCountT = unsigned short;
};
template <typename T>
struct Object : ObjectBase {
using ObjectBase::RefCountT;
};
然后
ObjectBase::RefCountT x;
一般来说,在模板中包含任何不依赖于模板参数的东西是有益T
的。请注意,例如
template <>
struct Object<int> : ObjectBase {};
Object
是与一般声明(即没有成员别名)毫无共同之处的特化。您将不得不重复专业化中的所有内容,除非您将其移至ObjectBase
. 因此,我建议 A) 或 C)。
推荐阅读
- javascript - ReactJS 样式组件中的响应式道具
- excel - 搜索非空白字符串并返回范围
- c# - 当代码以部分信任运行时,无法新建 gRPC.Core.Channel 实例
- laravel - 如何解决 Laravel 服务器错误 500
- c# - AWS RSD - C# .Net 核心实体框架 - 创建表 - 访问被拒绝
- docker - 通过 ElasticBeanStalk 与 Docker Image 交互
- java - 将标记当前位置拖到另一个位置时如何更新位置?
- arrays - 无法将条目集合附加到 NumPy 数组
- python - 如何计算斜率 b/w 2 点?
- python - 选择后关闭 tkinter 菜单