Czy można wnioskować o parametrach szablonu krotki z inicjalizacji typu nawiasowego?
W tym przykładzie możliwe jest odjęcie rodzaju parametrów szablonutuple
?
#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)
}
Dodałem drugi argumentother
aby uniknąć rozwiązań zawierających zmienne argumenty na poziomie funkcjifun
. Ponadto staram się unikać używaniamake_tuple
, przynajmniej z kodu użytkownika (tj. wmain()
). W rzeczywistości nie musi to byćtuple
wpisz ten, który jest zaangażowany, o ile dozwolona jest „pożądana składnia”, a jej typy elementów można wywnioskować na późniejszym etapie.
(Również, choć podobne, to nie ma z tym nic wspólnegoinitializer_list
ponieważ nie działa w ogóle, mając odmienne elementy w nawiasach klamrowych)
Co najmniej się nie udajeclang 3.2
igcc 4.7.2
. Czy istnieje nadzieja, że zadziała z obecnym lub prawie przyszłym standardem? (np. przyszłość (?)initializer_tuple
.)
(Może to być bardzo przydatne, aby dodać ekspresyjność do wywołań funkcji, agregując podelementy, ale można o tym dyskutować)
Uwaga: dla przykładowego kodu wydaje się, żestd::forward_as_tuple
jest bardziej odpowiedni niżstd::make_tuple
więc argumenty niekoniecznie są kopiowane:http://en.cppreference.com/w/cpp/utility/tuple/forward_as_tuple . Nadal nie jest tak miło, jak gdyby istniała wbudowana funkcja języka dla heterogenicznych list inicjatorów.