可以在独立于类模板的类中进行“使用”吗?

如果我在类或结构中使用typedefusing,有时我希望它独立于用于该类或结构的模板。

在下面的示例中,我会使用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)。


以上是可以在独立于类模板的类中进行“使用”吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>