Ist es möglich, Template-Parameter des Tupels aus der Klammertyp-Initialisierung abzuleiten?

In diesem Beispiel ist es möglich, den Abzug des Vorlagenparametertyps des zuzulassentuple?

#include<tuple>
#include<string>

template<class T1, class T2>
void fun(std::tuple<T1, T2> t, std::string other){}

int main(){
    fun(std::tuple<double, int>(2.,3), std::string("other")); // ok
    fun(std::make_tuple(2.,3), std::string("other")); // ok, but trying to avoid `make_tuple`
    fun({2.,3},std::string("other")); // desired syntax but
    // giving compilation error: candidate template ignored: couldn't infer template argument 'T1' void fun(std::tuple<T1, T2> t)
}

Ich habe das zweite Argument hinzugefügtother Vermeiden von Lösungen mit unterschiedlichen Argumenten auf Funktionsebenefun. Außerdem versuche ich, die Verwendung von zu vermeidenmake_tuple, zumindest aus dem Benutzercode (d. h. inmain()). Tatsächlich muss es nicht das seintuple Geben Sie die betreffende ein, solange die "gewünschte Syntax" zulässig ist und die Elementtypen zu einem späteren Zeitpunkt abgeleitet werden können.

(Auch wenn es ähnlich ist, hat dies nichts damit zu tuninitializer_list (da es überhaupt nicht funktioniert, wenn unterschiedliche Elemente in den Klammern sind)

Zumindest beiclang 3.2 undgcc 4.7.2. Gibt es irgendeine Hoffnung, dass es mit dem gegenwärtigen oder einem in naher Zukunft liegenden Standard funktionieren würde? (z. B. eine Zukunft (?)initializer_tuple.)

(Dies kann sehr nützlich sein, um Funktionsaufrufen Ausdruck zu verleihen, indem Unterelemente aggregiert werden, aber darüber kann man streiten.)

Hinweis: Für den Beispielcode scheint dies der Fall zu seinstd::forward_as_tuple ist angemessener alsstd::make_tuple Die Argumente müssen also nicht unbedingt kopiert werden:http://en.cppreference.com/w/cpp/utility/tuple/forward_as_tuple . Immer noch nicht so schön, als ob es eine eingebaute Sprachfunktion für heterogene Initialisierungslisten gäbe.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage