我能否将类级typedef用作基类的模板参数?

4

Assume a templated 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

我认为没有办法在类中定义typedef,然后在类外部不带类限定符引用它。 - 101010
3个回答

4

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

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

这肯定是一种方法,但并不理想,因为使用您的解决方案,我必须在每次想要使用该类时编写 using 语句,或者将其放在 ChildClass 的头文件中,这将具有与类外typedef相同的效果。 我不想在每次使用该类时编写using语句,因为typedef仅与私有类特性相关。(对于没有指出这一点我很抱歉) - user2296653

3
您可以在基类中定义它:
template <typename T> class BaseClass {
protected:
    typedef T LocalType;

    // whatever else
};

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

基类应该相当抽象,并且不了解复杂的实现特定类型。否则,将基类作为模板化可能也没有太多意义。对于没有明确指出这一点表示抱歉。 - user2296653
它不需要了解复杂类型的任何信息。它只需要知道由派生类提供的模板参数即可。 - Mike Seymour
@user2296653:请看我的更新,更清晰地表明T是指模板参数,而不是复杂的类型名称。 - Mike Seymour
啊,我之前确实没有理解正确。感谢您的编辑。很好的解决方案。 - user2296653

3

不要把typedef放在局部命名空间中。

最好的做法是将其放在封闭命名空间中,因为您在该命名空间的两个类型(ChildClassBaseClass<LocalType>)中使用了它。


不,我在基类中只是以抽象的方式使用类型T。MyVeryVeryComplicatedType的详细信息仅由子类使用。 - user2296653
1
@user2296653:如果在基类中已经足够使用它,否则您就不需要将其作为模板参数传递下去。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接