私有类型的模板特化
Template Specialization for Private Types
我有一个通用算法需要访问其模板类型的特征。有一个特性 class 可以专门用于提供这些特性。
在我的 class 中使用此算法时,我想将其与 class 中定义的私有类型一起使用。
但是,专业化只能发生在 namespace
或无法访问我的 class 的全球范围内。
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
class?
您可以通过 template friend declaration 将 class 模板 Trait
设为 class 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>;
};
我有一个通用算法需要访问其模板类型的特征。有一个特性 class 可以专门用于提供这些特性。
在我的 class 中使用此算法时,我想将其与 class 中定义的私有类型一起使用。
但是,专业化只能发生在 namespace
或无法访问我的 class 的全球范围内。
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
class?
您可以通过 template friend declaration 将 class 模板 Trait
设为 class 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>;
};