【问题标题】:Can I use a class level typedef as template argument for the base class?我可以使用类级别的 typedef 作为基类的模板参数吗?
【发布时间】:2014-05-02 13:57:04
【问题描述】:

假设一个模板化的基类:

template<typename T>class BaseClass;

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

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

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

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

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

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

【问题讨论】:

  • 我认为没有办法在class 中定义您的typedef,然后在没有班级资格的情况下解决它。

标签: c++ templates inheritance typedef


【解决方案1】:

只需使用一个小助手命名空间:

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

【讨论】:

  • 这当然是一种方法,但并不理想,因为使用您的解决方案,我必须在我想使用该类时编写 using 语句,或者将其放在 ChildClass 的头文件中与类外的 typedef 具有相同的效果。我不想在使用类时编写 using 语句,因为 typedef 仅与私有类功能相关。 (很抱歉没有指出这一点。)
【解决方案2】:

你可以在基类中定义它:

template <typename T> class BaseClass {
protected:
    typedef T LocalType;

    // whatever else
};

class ChildClass : public BaseClass<MyVeryVeryVeryComplicatedType> {
    // LocalType is usable here, and aliases MyVeryVeryVeryComplicatedType
};

【讨论】:

  • 基类应该相当抽象,不知道复杂的实现特定类型。否则,将基类模板化也可能没有太大意义。很抱歉没有明确指出。
  • @user2296653:它不需要了解复杂类型的任何信息。它只需要知道它的模板参数,由派生类提供。
  • @user2296653:查看我的更新,这更清楚地表明T 指的是模板参数,而不是复杂的类型名称。
  • 啊,我之前确实没看懂。感谢您的编辑。很好的解决方案。
【解决方案3】:

没有。将typedef 放在封闭的命名空间中。

这是最有意义的无论如何,因为您在该命名空间的两种类型(ChildClassBaseClass&lt;LocalType&gt;)中使用它。

【讨论】:

  • 不,我在基类中仅以抽象方式使用类型 T。 MyVeryVeryComplicatedType 的详细信息仅供子类使用。
  • @user2296653:你在基类中使用它足够,否则你不需要将它作为模板参数传递下来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多