私有类型的模板专业化

Template Specialization for Private Types

本文关键字:专业化 类型      更新时间:2023-10-16

我有一个通用算法,需要访问其模板类型的特征。有一个特性类可以专门用于提供这些特性。

在类中使用此算法时,我希望将其与类中定义的私有类型一起使用。

但是,专业化只能发生在namespace或全局范围内,因为我的类是不可访问的。

class A
{
    struct Secret 
    {};
};
template <typename T> struct Trait {};
// Inaccessible type ----vvvvvvvvv
template <> struct Trait<A::Secret> // Specialize for  PRIVATE type A::Secret
{ 
    A::Secret magic_value() { return{}; } // ERROR: 'A::Secret': cannot access private struct declared in class 'A'
};  

是否有可能以某种方式用私有类型专门化模板,至少在可以访问该类型的范围内是这样?

也许可以将专门化声明为friend类?

您可以通过模板友元声明使类模板Trait成为类A的友元。

template <typename T> struct Trait {};
class A
{
    struct Secret 
    {};
    template <typename T>
    friend struct Trait;
};

或者参考A::Secret的完全专业化。

template <typename T> struct Trait {};
class A
{
    struct Secret 
    {};
    friend struct Trait<A::Secret>;
};