Dies ist nicht so einfach wie es aussieht. std::result_of
missbraucht das Typsystem, um Informationen über einen Funktionsaufruf einzufügen, damit es herausfinden kann, wie der Rückgabetyp des Funktionsaufrufs aussehen würde.
Das Argument std::result_of
hat die Form Fty(T1, T2, ...)
, wo Fty
ein aufrufbare Typ ist und T1
usw. sind die Typen der Argumente, die es mit genannt wird. Angesichts dieser Informationen hat std::result_of
einen verschachtelten Typ mit dem Namen type
, der ein Synonym für den Rückgabetyp des Aufrufs eines aufrufbaren Typs mit der Signatur Fty
mit Argumenten der angegebenen Typen ist. Puh, das ist ein Bissen.
Also, in result_of<void (*(int*))(int)>
gibt es zwei Teile der Vorlage Argument. Der erste Teil ist void (*(int*))
, welcher der aufrufbare Typ ist. In diesem Fall ist es ein Zeiger zur Funktion, der int*
nimmt und void
zurückgibt. Der zweite Teil ist (int)
, was die Typenliste für die vorgeschlagenen Argumente ist.
Also was das sagen soll ist, dass std::result_of
instanziiert wird mit einer Funktion, deren Typ ist void (*(int*))
und mit einer Argumentliste von (int)
. Und das ist das Problem, wie Sie angegeben haben: Sie können ein Argument vom Typ int
nicht an eine Funktion übergeben, die ein Argument vom Typ int*
verwendet.
Sind Sie nicht froh, dass Sie gefragt haben? (Übrigens, das ist ziemlich low-level Vorlage Hacker, die nicht mehr benötigt wird; decltype
ist eine viel sauberere Möglichkeit, den Rückgabetyp eines Funktionsaufrufs herauszufinden).
Wenn 'func' ein' int' erfordert, warum passierst du ein 'int *'? – NathanOliver
Das war ein Fehler im Code, den ich heute sah - wahrscheinlich war das ein Tippfehler. –
Eine ähnliche Aussage gibt [dies nach cdecl] (http://cdecl.ridiculousfish.com/?q=void+%28*f%28int*%29%29%28int%29). – ArchbishopOfBanterbury