我可以使用类级别的typedef作为基类的模板参数吗?
Can I use a class level typedef as template argument for the base class?
假设一个模板化的基类:
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
放到封闭的命名空间
这是最有意义的无论如何,因为您在该名称空间的两个类型(ChildClass
和BaseClass<LocalType>
)中使用它。
相关文章:
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 命名参数习惯用法和(抽象)基类
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 如何允许模板参数中的类类型,仅当它有两个基类时
- 为什么我需要在成员发起器列表中重复基类的模板参数?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- 根据参数数调用 mixin 基类的构造函数
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 在C++单元测试上下文中,抽象基类是否应将其他抽象基类作为函数参数
- C++ 如何使派生类自动获取基类参数
- 将派生类作为参数传递给方法,该方法是具有智能指针的基类
- 将函数上调整到基类参数的另一个
- 将派生类对象传递给具有 C++ 中基类参数的函数时,为什么要传递引用而不是值?
- 如何使用派生类中的虚拟函数,该函数在另一个具有基类参数的类中声明
- 将基类 2 参数构造函数调用到子类 1 参数构造函数中
- 指向友元函数中基类参数类型的指针
- 按值传递共享指针并接受作为基类参数是如何工作的
- 为带有基类参数的派生类参数调用函数重载