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?
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% 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:
Hier ist ein Live-Beispiel .
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.
Tags und Links c++ c++11 typetraits template-deduction