可以在独立于类模板的类中进行“使用”吗?
如果我在类或结构中使用typedef或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)。