21 September 2023

C++ 核心指南目录

“Place non-dependent class template members in a non-templated base class”

理由

可以不用指定模板参数、不用实例化模板而使用基类成员

例子

template<typename T>
class Foo {
public:
    enum { v1, v2 };
    // ...
};

尽管这个枚举不需要模板参数,但是你仍然要给出一个模板参数才可以使用。

struct Foo_base {
    enum { v1, v2 };
    // ...
};

template<typename T>
class Foo : public Foo_base {
public:
    // ...
};

这样就不需要为基类指定模板参数了。

注意

本规则的一个更通用的版本是“如果一个类模板成员仅仅依赖于 M 个模板参数中的 N 个,那么就定义只用到 N 个模板参数的基类。”当 N == 1 的时候,就得到了规则 T.61。