2017-11-16 3 views
0

Ich bin mir bewusst, der sehr einfach Nutzung von decltype, wie inableiten Rückgabetyp einer Funktion Vorlage von Argumenttypen (nicht von Argumenten)

template<typename T, typename F> 
auto myfunc(T elem, F func) -> decltype(func(elem)) 
{ 
    return func(elem); 
} 

Ich mag würde wissen, ob Rückgabetyp einer Funktion kann abgeleitet werden, ohne auf die Funktionsargumente zu verweisen, sondern auf den Argumenttyp, also etwas ähnlich wie decltype(func, T)?

Ich verstehe, dass in diesem Fall ist man ein Typ und der andere ist ein Objekt, aber was ich versuche zu tun scheint sehr natürlich zu sein. Aber ich habe es nicht geschafft, eine einfache Art auszudrücken, was ich will. Irgendeine Hilfe?

Vielen Dank.

Antwort

3

Das ist genau das, was std::declval ist für:

template<typename T, typename F> 
auto myfunc(T elem, F func) -> decltype(func(std::declval<T>())) 
{ 
    return func(elem); 
} 

Aber da Sie tun müssen Objekt dieses Typs bereits, warum die Mühe?

+0

Meine Absicht war, einen Container zu übergeben und ':: value_type' zu ​​verwenden, um den Rückgabetyp meiner Funktion zu bestimmen, der das erste Element (z. B.) als Argument verwendet. Vielleicht etwas wie 'decltype (func (declval )))' wo 'CType' der Typ des Containerobjekts (vorausgesetzt, hat das ':: value_type' Mitglied). So einfach funktioniert das aber nicht. – Jersey

+0

@Jersey füge 'std :: declval's Klammern hinzu (es ist eine Funktion) und du solltest gut gehen. – Quentin

+0

Sie hatten tatsächlich recht - vielen Dank. Es ist witzig, wie solche kleineren Ungenauigkeiten (in menschlicher Hinsicht) die Semantik umkreisen. Und Compiler sind wählerisch: p – Jersey

Verwandte Themen