Vorlage Argument Deduction schlägt mit C ++ 11 type_traits fehl

7

Ich versuche zu verstehen, wie man C ++ (11) <type_traits> verwendet.

Hier ist mein triviales Testprogramm

%Vor%

Wenn es mit GCC 4.8.1 kompiliert wird, wird es als

angezeigt %Vor%

Ich habe keine Ahnung, warum GCC den Template-Parameter U nicht ableiten kann. Jeder weiß, welche Informationen mein Code fehlt, das ist, wie schreibe ich ein Programm in C ++ 11, die einen vorzeichenlosen Ganzzahl-Typ als erstes Argument und einen ganzzahligen Vorzeichen-Typ als Zweites nimmt?

    
Nordlöw 07.06.2013, 14:14
quelle

5 Antworten

13

typename std::enable_if<std::is_unsigned<U>::value,U>::type ist kein ableitbarer Kontext. Um daraus U abzuleiten, müsste der Compiler die umgekehrte Operation von std::enable_if anwenden. Es sieht nicht so schwer aus, das stimmt, aber das ist, weil du von einer einfachen Sache wie enable_if sprichst. Es wäre unmöglich, dies von jedem Merkmal zu verlangen, also spielt C ++ es einfach cool und macht keine seltsamen Regelausnahmen: Es ist im Allgemeinen nicht ableitbar, es ist in diesem nicht nachvollziehbar.

Sie können es stattdessen auch so machen:

%Vor%

Oder in Compilern, die diesen Stil nicht korrekt unterstützen, können Sie einfach ein zusätzliches Standard-Argument hinzufügen:

%Vor%

... oder Unsinn mit dem Rückgabetyp.

%Vor%     
R. Martinho Fernandes 07.06.2013, 14:20
quelle
7

Sie geben dem Compiler keine Möglichkeit, U und S abzuleiten. Sie können Ihre Funktion wie folgt umschreiben und die SFINAE-Prüfungen in der Vorlagenparameterliste verschieben:

%Vor%

Hier ist ein Live-Beispiel .

    
Andy Prowl 07.06.2013 14:19
quelle
3

Sie müssen zuerst die Typen ableiten, bevor Sie über die Typen entscheiden können!

Es sollte sein:

%Vor%     
Kerrek SB 07.06.2013 14:19
quelle
2

Es ist nicht möglich, einen Template-Parameter aus einem "nested typedef" -Ausdruck abzuleiten. Das heißt, es ist möglich, U von some_template<U> abzuleiten, nicht jedoch von some_template<U>::type .

Der Compiler kann unmöglich alle (unendlichen!) Instanziierungen von some_template aufzählen und sehen, für welche von ihnen der verschachtelte typedef dem tatsächlichen Argumenttyp entspricht.

    
Angew 07.06.2013 14:17
quelle
2

Versuchen Sie:

%Vor%     
Manu343726 07.06.2013 14:22
quelle