如何在另一个 class 中特化模板 class 的构造函数?

How to specialize constructor of template class in another class?

考虑以下 classes:

// Class1.hpp
class Class1 {};

// Class2.hpp
class Class2 {};

// ClassA.hpp
#include "Class1.hpp"
#include "Class2.hpp"

class A {
private:
    enum class Enum {
        Enum1,
        Enum2
    };

    struct B {
        B(Enum argEum) : enumMember{argEnum} {}
        Enum enumMember;
    };

    template <class T>
    struct C : public B {}
};

现在我想对 C 的构造函数进行以下特化:

C<Class1>::C() : B{Enum::Enum1} {}
C<Class2>::C() : B{Enum::Enum2} {}

根据我的尝试,我想我必须将专业化放在 class A 的 class 定义之外,但我真的不知道该怎么做。

您可以在任何可能出现模板化实体声明的地方放置专门化。命名空间范围很好,但它要求您完全限定您的专长。

此外,您不能专门化未首先在主模板中声明的成员。所以考虑到这两点:

// In the class
template <class T>
struct C : public B {
    C() = delete;
};

// In namespace scope

template<>
A::C<Class1>::C() : B{Enum::Enum1} {}

template<>
A::C<Class2>::C() : B{Enum::Enum2} {}

还有一个live example可以参考。