2012-11-25 15 views
13

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ę

+0

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. –

+0

Wygląda na to, że szukasz tego: http://cpp0x.centaur.ath.cx/temp.deduct.call.html – yonilevy

+0

Tak, to jest dokładnie yonilevy. Dzięki. –

Odpowiedz

14

Ustęp 14.8.1.2 standardowych C++ 03 państw

„Trailing argumenty szablonów, które można wywnioskować (14.8.2), mogą być pominięte na liście wyraźnych argumentów szablonach . "

+0

To jest potwierdzenie, którego szukałem, dzięki. –

+0

Aby dodać splot do tego problemu: czy nie ma możliwości wyprowadzenia argumentów szablonu, które znajdują się na środku listy argumentów, jeśli * można * wywnioskować z poprzednich argumentów, ale kolejne argumenty muszą być jawnie określone? – haelix

+0

Mam na myśli, podobnie jak w kodzie OP, ale jeśli funkcja jest zadeklarowana jako "szablon std :: tuple test (C c)' - może napisać coś takiego jak 'test (3.14) ' – haelix

Powiązane problemy