首页 > 解决方案 > 可以在独立于类模板的类中进行“使用”吗?

问题描述

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

在下面的示例中,我将使用Object<T>::RefCountT,它会起作用,但我宁愿Object::RefCountT在这种情况下使用类似的东西,因为这样我就不必随意选择一种类型(阅读时可能会造成混淆)。

template <typename T>
struct Object {
    using RefCountT = unsigned short; // This is independent of T
};

对我来说,明显(但不理想)的解决方案是在课堂之外定义它,比如

using ObjectRefCountT = unsigned short;

我还尝试在没有模板的情况下进行重新定义,假设它们不会被认为是相同的,但这会导致有关重新定义的预期错误。

我假设因为它是一个类而不是一个函数,所以我不能隐式地做到这一点,编译器怎么知道它在这里无关紧要?

标签: c++templatesusing

解决方案


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)。


推荐阅读