2017-12-09 2 views
2

Ich habe eine templated Interface-Klasse, mit ein paar implementierten Methoden und ein paar virtuellen.Verwenden von Direktive und partielle Spezialisierung

Ich muss es spezialisieren, um die Signatur einiger Methoden zu ändern, aber andere würden gleich bleiben.

Gibt es eine Möglichkeit, die Methoden, die gleich geblieben sind wieder aus der ursprünglichen Vorlage, entweder über using Direktive, durch direkten Aufruf an sie zurück oder auf andere Weise, oder ich muss kopieren/fügen Sie jede einzelne Methode zurück in die Spezialisierung?

template <typename T> 
struct X { 
    void faa(T t) const { std::cout << t << '\n'; } 
    void foo() const { std::cout << "foo\n"; } 
}; 

template <> 
struct X<void> { 
    void faa() const { std::cout << "none\n"; } 

    // Something along these lines 
    // using X<T>::foo; 
    // void foo() const { X<T>::foo(); } 
}; 

Antwort

4

Scheint so. Sie können die Funktionen in X mit verschiedenen Signaturen nicht unter Verwendung der using Direktiven abrufen. Es gibt eine bessere Problemumgehung, als alles von der Vorlage zur Spezialisierung zu kopieren. Sie können eine "gemeinsame Basisklasse" verwenden.

template <typename T> 
struct X_base { 
    void foo() const { std::cout << "foo\n"; } 
}; 

template <typename T> 
struct X : public X_base<T> { 
    void faa(T t) const { std::cout << t << '\n'; } 
}; 

template <> 
struct X<void> : public X_base<void> { 
    void faa() const { std::cout << "none\n"; } 
}; 

Auf diese Weise X<void>::foo wirkt wie X_base<void>::foo, während X<T>::faa und X<void>::faa nicht stören einander.

Verwandte Themen