Rozglądam się w Google, próbując znaleźć odpowiedź na to pytanie, ale nie mogę wyszukiwać poprawnych terminów, ponieważ nie mogę znaleźć nikogo, kto mówiłby o tym zachowaniu. Próbuję dowiedzieć się, czy częściowa specyfikacja funkcji szablonowych jest częścią standardu C++, czy jest to coś konkretnego kompilatora.Częściowa specyfikacja funkcji szablonu w C++ działa, ale dlaczego?
Przez częściową specyfikację mam na myśli określenie tylko typów, których kompilator nie może wydedukować. Więc jeśli mam funkcji szablonu „F”, które trwa 3 rodzaje, a jeden jest używany w parametrze i można wywnioskować, że mogę nazwać „F” z formą f<type, type>(parameter)
Oto przykład:
#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;
}
Testowałem to z g ++ 4.5.3, g ++ 4.6.3, VS2010 i VS2012. Ponieważ wydaje się być szeroko wspierany przez kompilatory, założę się, że jest częścią standardu, ale czy ktoś może to potwierdzić? Czy ktoś ma jakieś linki lub wskazówki do zasobów, które mogą wyjaśnić, dlaczego to działa?
Dziękuję
Nie wyjaśniłeś, dlaczego uważasz, że to nie powinno działać. Tutaj naprawdę nie ma żadnego pytania. W każdym razie mówisz o odjęciu argumentów, co z pewnością nie jest nowe. –
Wygląda na to, że szukasz tego: http://cpp0x.centaur.ath.cx/temp.deduct.call.html – yonilevy
Tak, to jest dokładnie yonilevy. Dzięki. –