2017-05-08 2 views
1

In einer Konstruktorvorlage, die ich schreibe, möchte ich eine statische Assert auf einer Schnittstelle einer Klassenvorlage haben. Ein grundlegendes (nicht Compilierung) Beispiel für die Situation wie folgt dar:Statische Bestätigung der Schnittstelle zur Klassenvorlage

class Baz 
{ 

} 

template<typename T> 
class Bar: public Baz 
{ 

} 

template<typename T> 
class Qux: public Baz 
{ 

} 

class Foo 
{ 
    template<typename T> 
    Foo(T typePar , Baz& baz) 
    { 
     // here I would like to assert that Baz is an interface to a class 
     specialized on T 
    } 
} 

Meine beste Vermutung des Hinzufügen einer Funktion zu Baz ist, aber da dies nicht als Templat werden kann, würde ich jetzt nicht, wie ich das nennen könnte bei Kompilierzeit

+1

Sie meinen, Sie möchten zur Kompilierzeit überprüfen, dass 'Baz' tatsächlich eine Referenz auf eine' Bar 'oder' Qux '' ist? Das kann nicht gemacht werden, weil der dynamische Typ von 'baz' zur Laufzeit andere Dinge sein kann. – TartanLlama

+0

Sie könnten 'Baz &' in einen Template-Parameter ändern und dann die Prüfung durchführen, aber dann könnten Sie keinen 'Baz' an Ihren Konstruktor übergeben, Sie müssten ihn zuerst umwandeln. – TartanLlama

+0

Ich sehe was du meinst. Das Ändern in einen Template-Parameter ist für mich keine wirkliche Option. Also werde ich nur auf diese statische Behauptung verzichten. – laurisvr

Antwort

-1

Wenn Sie wollen „... dass Baz behaupten ist eine Schnittstelle zu einer Klasse auf T spezialisiert“, und wenn ich das so interpretieren kann „... behauptet, dass T eine übergeordnete Klasse von Baz ist“, dann können Sie static_assert dies wie folgt:

class Foo 
{ 
    template<typename T> 
    Foo(T typePar , Baz& baz) 
    { 
     // assert that T is a base class of Baz 
     static_assert(std::is_base_of<T, Baz>::value, "T is not a base class of Baz."); 
    } 
}; 

Dies gilt auch für jede Unterklasse von Baz, wegen Transitivität (wenn T geordnete Klasse von Baz ist, dann T ist auch eine übergeordnete Klasse von jeder Unterklasse von Baz).

Beachten Sie jedoch, dass Sie für das Funktionsargument baz nichts statisch geltend machen können, da Funktionsargumente keine Const-Ausdrücke sein können.

+0

Ich glaube nicht, dass Ihre Interpretation richtig ist, Sie können sehen, dass "Baz" nichts erbt. OP möchte sicherstellen, dass der dynamische Typ von 'Baz'' Bar 'oder' Qux 'ist, aber Sie können tu das zur Kompilierzeit. – TartanLlama

Verwandte Themen