2012-11-25 13 views
13

Ich habe mich auf Google umgeschaut, um eine Antwort zu finden, aber ich darf nicht mit den richtigen Begriffen suchen, weil ich niemanden finde, der über dieses Verhalten spricht. Ich versuche herauszufinden, ob eine partielle Spezifikation von Vorlagenfunktionen Teil des C++ - Standards ist oder ob dies etwas Compiler-spezifisches ist.Partielle Vorlage Funktionsspezifikation in C++ funktioniert, aber warum?

Mit Teilspezifikation meine ich nur die Typen, die der Compiler nicht ableiten kann. Also, wenn ich eine Vorlage Funktion ‚f‘, die 3 Arten nehmen, und man wird in einem Parameter verwendet und abgeleitet werden kann, könnte ich mit dem Formular ‚f‘ nenne f<type, type>(parameter)

Hier ein Beispiel:

#include <iostream> 
#include <tuple> 
#include <string> 

template<class A, class B, class C> 
std::tuple<A, B> test(C c) 
{ 
    // do something based on c, return tuple with types A and B 
    return std::make_tuple(A(), B()); 
} 

int main(void) 
{ 
    // I expected I would have to use this form. Specify all parameters. 
    std::tuple<int, int> value3 = test<int, int, int>(5); 

    // Here, I only specified the return value types, did not specify the parameter type, yet it compiles. 
    auto value1 = test<int, int>("c-string"); 

    // Similar example here. Return types specified, parameter type deduced. Compiles fine. 
    auto value2 = test<std::string, int>(42); 

    return 0; 
} 

Ich habe das mit g ++ 4.5.3, g ++ 4.6.3, VS2010 und VS2012 getestet. Da es scheint, von den Compilern weitgehend unterstützt zu werden, ich wette, es ist Teil des Standards, aber kann das bestätigen? Hat jemand irgendwelche Links oder Hinweise auf Ressourcen, die erklären könnten, warum das funktioniert?

Danke

+0

Sie haben nicht erklärt, warum Sie denken, dass dies nicht funktionieren sollte. Hier ist wirklich keine Frage. Wie auch immer, du redest über Argumentabzug, was sicherlich nicht neu ist. –

+0

Scheint so, als ob Sie nach diesem suchen: http://cpp0x.centaur.ath.cx/temp.deduct.call.html – yonilevy

+0

Ja, das ist es genau yonilevy. Vielen Dank. –

Antwort

14

Ziffer 14.8.1.2 der C++ 03-Standard ist

„template Argumente Nachgestellte, die (14.8.2) abgeleitet werden kann, kann aus der Liste der expliziten Template-Argumente weggelassen werden . "

+0

Dies ist die Bestätigung, die ich suchte, Danke. –

+0

Um diesem Problem eine Wendung zu geben: Gibt es keine Möglichkeit, Template-Argumente, die sich in der Mitte der Argumentliste befinden, abzuleiten, wenn sie * aus vorhergehenden Argumenten abgeleitet werden können, aber die nachfolgenden Argumente explizit angegeben werden müssen? – haelix

+0

Ich meine genau wie in der OP-Code, aber wenn die Funktion als 'Vorlage std :: Tupel test (C c) 'erklärt - vielleicht etwas schreiben wie' test (3.14) ' – haelix

Verwandte Themen