2012-03-30 3 views
2

Ist es möglich, eine Template-Klasse zu spezialisieren, um zusätzliche Template-Parameter zu übernehmen?C++ spezialisieren eine Template-Klasse, um einen zusätzlichen Template-Parameter zu übernehmen

Zum Beispiel:

template <typename T> 
struct X { 
    void foo() { cerr << "Generic" << endl;} 
}; 


template <> 
template <bool b> 
struct X<int> { 
    void foo() { cerr << "Specialization" << endl;} 
}; 

ich nicht die oben genannten Arbeiten mit g ++ machen könnte, aber vielleicht gibt es einen Trick, die diese Arbeit machen.

Edit: Ich will nicht die Vorlage <bool b> auf die Basisvorlage X bewegen, weil es Merkmal nur X<int>. ist, wenn ich zu haben, ist es eine Möglichkeit, Benutzer keine Werte angeben, erlauben kann haben dafür? Ich würde wirklich gerne einen Ansatz, der diese Route nicht geht.

+0

Haben Sie von einer partiellen Template-Spezialisierung gehört? –

+2

"* Wenn ich muss, gibt es eine Möglichkeit, dass ich Benutzern erlauben kann, keine Werte dafür anzugeben? *" Ja - Standard-Template-Parameter. Z.B. 'Vorlage '. – ildjarn

+1

Wie @ildjarn sagte, können Sie - aber ich würde darauf hinweisen, dass es in den meisten Fällen besser ist, einen anderen Typ als bool zu verwenden. 'mytempl ' vs. 'myempl ' ist normalerweise aussagekräftiger als 'mytempl ' vs. 'mytempl '. –

Antwort

2

Sie könnten Ihre primäre Vorlage ändern, um einen Proxy-Züge Klasse zu akzeptieren statt:

template <typename T> 
struct Foo 
{ 
    typedef typename T::type type; 

    // work with "type" 

    void static print() { std::cout << T::message << std::endl; } 
} 

dann die Eigenschaft Klasse definieren:

template <typename T> 
struct traits 
{ 
    typedef T type; 
    static const char * const message = "Generic"; 
}; 

Jetzt können Sie Foo<traits<double>> und Foo<traits<int>> instanziiert, und Sie können einkapseln zusätzliches Verhalten in der Traits-Klasse, die Sie nach Bedarf spezialisieren können.

template <> 
struct traits<int> 
{ 
    typedef int type; 
    static const char * const message = "Specialized"; 
}; 
+0

Man muss die primäre Vorlage dafür nicht ändern. Machen Sie einfach eine Spezialisierung, die 'Merkmale ' akzeptiert. –