可以在 class 中独立于 class' 模板制作 'using' 吗?
Can a 'using' be made in a class independent of the class' template?
如果我在 class 或结构中使用 typedef
或 using
,有时我希望它独立于用于 class 或结构的模板.
在下面的示例中,我会使用 Object<T>::RefCountT
,这会起作用,但在这种情况下我宁愿使用类似 Object::RefCountT
的东西,因为这样我就不必随意选择一个类型(阅读时可能会造成混淆)。
template <typename T>
struct Object {
using RefCountT = unsigned short; // This is independent of T
};
对我来说,显而易见(但不理想)的解决方案是在 class 之外定义它,例如
using ObjectRefCountT = unsigned short;
我还尝试在没有模板的情况下进行重新定义,假设它们不会被认为是相同的,但这导致了关于重新定义的预期错误。
我假设因为它是一个 class 而不是函数,所以我不能隐式地执行它,编译器怎么知道它在这里无关紧要?
Object
只是一个模板,但是你需要实例化它才能访问它的成员别名。我看到几个选项:
A) 不要让 RefCountT
成为 Object
的成员。
B) 提供一个默认参数,这样你就不需要明确选择一个类型来访问别名:
template <typename T = void>
struct Object {
using RefCountT = unsigned short; // This is independent of T
};
然后
Object<>::RefCount x;
C) 对所有实例化使用公共基础class:
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).
如果我在 class 或结构中使用 typedef
或 using
,有时我希望它独立于用于 class 或结构的模板.
在下面的示例中,我会使用 Object<T>::RefCountT
,这会起作用,但在这种情况下我宁愿使用类似 Object::RefCountT
的东西,因为这样我就不必随意选择一个类型(阅读时可能会造成混淆)。
template <typename T>
struct Object {
using RefCountT = unsigned short; // This is independent of T
};
对我来说,显而易见(但不理想)的解决方案是在 class 之外定义它,例如
using ObjectRefCountT = unsigned short;
我还尝试在没有模板的情况下进行重新定义,假设它们不会被认为是相同的,但这导致了关于重新定义的预期错误。
我假设因为它是一个 class 而不是函数,所以我不能隐式地执行它,编译器怎么知道它在这里无关紧要?
Object
只是一个模板,但是你需要实例化它才能访问它的成员别名。我看到几个选项:
A) 不要让 RefCountT
成为 Object
的成员。
B) 提供一个默认参数,这样你就不需要明确选择一个类型来访问别名:
template <typename T = void>
struct Object {
using RefCountT = unsigned short; // This is independent of T
};
然后
Object<>::RefCount x;
C) 对所有实例化使用公共基础class:
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).