私有类型的模板专业化

时间:2016-08-04 07:30:34

标签: c++ templates template-specialization

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

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

但是,专业化只能在我的班级无法访问的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类?

1 个答案:

答案 0 :(得分:5)

您可以通过template friend declaration将班级模板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>; };

的完整专业化
{{1}}