2016-08-04 18 views
3

Ich habe einen generischen Algorithmus, der auf die Eigenschaften seines Vorlagentyps zugreifen muss. Es gibt eine Merkmalklasse, die auf die Bereitstellung dieser Merkmale spezialisiert sein kann.Vorlagenspezialisierung für private Typen

Wenn ich diesen Algorithmus innerhalb meiner Klasse verwende, möchte ich ihn mit einem privaten Typ verwenden, der in der Klasse definiert ist.

Spezialisierung kann jedoch nur innerhalb von namespace oder einem globalen Bereich erfolgen, auf den meine Klasse nicht zugreifen kann.

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' 
}; 

Ist es möglich, eine Vorlage mit einem privaten Typ zu spezialisieren, zumindest in Bereichen, in denen dieser Typ zugänglich ist?

Vielleicht ist es möglich, die Spezialisierung eine friend Klasse zu deklarieren?

Antwort

4

Sie könnten Klassenvorlage Trait der Freund der Klasse A über template friend declaration machen.

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

    template <typename T> 
    friend struct Trait; 
}; 

Oder auf die volle Spezialisierung der A::Secret verweisen.

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

    friend struct Trait<A::Secret>; 
}; 
+0

Bingo! Genau das, was ich brauchte :-). Vielen Dank. –

+0

@AdiShavit Gern geschehen. :) – songyuanyao

+0

@AdiShavit Sie sollten diese Antwort akzeptieren, wenn es Ihr Problem gelöst hat. – Brian