2017-12-29 61 views
0

Make C++ fail compilation on specific instantiation of template function erläutert, wie die Kompilierung fehlschlagen kann, wenn eine Funktion mit einer bestimmten Klasse instanziiert wird, nicht aber wie dies mit einer Klasse geschieht.make compilation fail bei spezifischer Instanziierung der Vorlagenklasse

Sagen wir, ich habe eine Klasse:

template<class T> 
class foo; 

und ein anderes class Bar. Wie würde ich die Kompilierung fehlschlagen lassen, wenn foo instanziiert oder auf Bar spezialisiert ist?

Alle Lösungen sind wie Laufzeit (obwohl die Auswertung zur Kompilierzeit ist, kann der Fehler nur zur Laufzeit angegeben werden, was nicht geeignet ist).

Antwort

6

Wenn Sie einen harten Kompilierungsfehler wollen, wenn foo<Bar> instanziiert wird, können Sie static_assert (die auch Sie eine benutzerdefinierte Fehlermeldung bereitstellen kann):

template <class T> 
class foo 
{ 
    static_assert(!std::is_same_v<T, Bar>, 
     "foo does not support Bar"); 
}; 

live example on wandbox

0

Sie tun können:

template<class T> 
class foo {}; 

struct bar {}; 

template <> 
class foo<bar>; 

Dies deklariert eine Spezialisierung für bar aber definiert es nicht, also alles tha t versucht, Instanziierung zu verursachen, wird fehlschlagen. Stellen Sie sicher, dass diese Spezialisierung in der gleichen Header-Datei wie die primäre Definition von foo deklariert wird, so dass es für eine Übersetzungseinheit nicht möglich ist, die primäre Definition, aber nicht die Spezialisierung zu sehen.

1

Setzen Sie eine static_assert (false, "Klasse kann nicht mit xxx instanziiert werden"); in der schlechten Spezialisierung.

struct foo { }; 
template<typename T> 
struct bar_base { 
... 
}; 
template<typename T> 
struct foo : foo_base<T> 
{ }; 
template<> 
struct bar<foo> 
{ 
    static_assert(false, "bar cannot be instantiated with foo"); 
}; 

Hier bar_base enthält alle tatsächlichen Implementierung.

Verwandte Themen