专门针对私有类型的模板特化

3
我有一个通用算法需要访问其模板类型的特性。可以专门提供这些特性的特征类。
在我的类中使用此算法时,我想将其与类内定义的私有类型一起使用。
然而,只有在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'
};  

在某些可访问此私有类型的作用域中,是否可能以某种方式专门化具有私有类型的模板?

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

1个回答

8
您可以通过使用模板友元声明,使类模板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>;
};

太好了!正是我需要的 :-). 谢谢。 - Adi Shavit
@AdiShavit 如果这个答案解决了您的问题,您应该接受它。 - Brian Bi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接