当前位置: 首页 > 知识库问答 >
问题:

私有类型的模板专门化

东方英豪
2023-03-14

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

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

然而,专门化只能发生在名称空间或全局范围内,而我的类是不可访问的。

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类?

共有1个答案

尉迟晔
2023-03-14

通过模板好友声明,你可以让类模板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>;
};
 类似资料: