我可以使用类级别的typedef作为基类的模板参数吗?

Can I use a class level typedef as template argument for the base class?

本文关键字:基类 参数 typedef 可以使 我可以      更新时间:2023-10-16

假设一个模板化的基类:

template<typename T>class BaseClass;

在其他类中,我想从这个继承,其中T是一个相当复杂的类型,所以我想使用typedef。因为我不想污染命名空间,所以我想在类定义中使用typedef:

class ChildClass : public BaseClass<MyVeryVeryVeryComplicatedType> {
  typedef MyVeryVeryComplicatedType LocalType;
  ...
}

当然,现在我还不能使用LocalType作为BaseClass的模板参数,并且必须编写两次复杂的定义(MyVeryVeryComplicatedType)。(所以我猜标题问题的答案是"不"。)

问题:是否有任何方法只定义一次,但仍然只在类内部定义(或以类似的方式限制LocalType的范围)?

注意:我考虑过使用宏,但注意到结果将与在类定义之前使用typedef相同(甚至更糟)。

编辑:澄清:我有一个基类,因为我想要有几个不同的孩子共享一些功能。共享部分只需要知道存在某种类型T。由于子类中使用的类型的细节与共享功能无关,因此我认为基类不应该知道这些细节(在实践中,我必须将许多#include语句放入基类中,以便能够为所有子类定义typedef)。每个子类都有相当不同的MyVeryVeryVeryComplicatedType

使用一个小的辅助命名空间:

namespace ChildClassNamespace {
    typedef MyVeryVeryComplicatedType LocalType;
    class ChildClass : public BaseClass<LocalType> { /* ... */ };
}
using ChildClassNamespace::ChildClass;

你可以在基类中定义它:

template <typename T> class BaseClass {
protected:
    typedef T LocalType;
    // whatever else
};
class ChildClass : public BaseClass<MyVeryVeryVeryComplicatedType> {
    // LocalType is usable here, and aliases MyVeryVeryVeryComplicatedType
};

No。把typedef放到封闭的命名空间

这是最有意义的无论如何,因为您在该名称空间的两个类型(ChildClassBaseClass<LocalType>)中使用它。

相关文章: