Definieren oder definieren Sie in Abhängigkeit von einem Klassenvorlagenparameter eine Funktion in der Klasse

8

Angenommen, wir haben eine Klasse:

%Vor%

Instanziieren Sie die Klasse jetzt wie folgt:

%Vor%

Es ist in Ordnung, diese Klasse wird 2 überladene Funktionen mit diesen Parametern haben: (float a, int b); (float a, float b);

Aber wenn Sie die Klasse so instanziieren:

%Vor%

Sie erhalten einen Kompilierungsfehler:

  

Mitgliedsfunktion neu deklariert.

Je nach Art des Typs möchte (oder will) ich nicht, dass der Compiler eine Funktion definiert, etwa so:

%Vor%

Aber natürlich funktioniert die obige Syntax nicht. Ist es möglich, eine solche Aufgabe in C ++ auszuführen? Wenn möglich, geben Sie bitte ein Beispiel an.

    
Vadim 01.05.2012, 09:14
quelle

3 Antworten

8

Sie könnten die Vorlagenspezialisierung verwenden:

%Vor%

--- EDIT ---

Wenn Sie viele gemeinsame Funktionen haben, können Sie Folgendes tun:

%Vor%     
Branko Dimitrijevic 01.05.2012, 09:22
quelle
8

Sie können C++11 std::enable_if verwenden:

%Vor%     
inf 01.05.2012 09:46
quelle
2

Verwenden Sie SFINAE:

%Vor%

Ausgabe:

%Vor%

Sie benötigen den C ++ 11-Modus, um den Standardvorlagenparameter in einer Funktionsvorlage zuzulassen. Und auch um enable_if und is_same zu erhalten, obwohl du stattdessen enable_if von Boost bekommen könntest.

Die "Warnung!" ist, weil mit Ihrem ursprünglichen Code g.function1(1.0,1.0); mehrdeutig war. Jetzt wird die Nicht-Template-Überladung bevorzugt. Sie können es wieder mehrdeutig machen, indem Sie

ausführen %Vor%     
Steve Jessop 01.05.2012 10:09
quelle

Tags und Links