Я искал Google, пытаясь найти ответ на этот вопрос, но я не должен искать правильные условия, потому что я не могу найти, чтобы кто-нибудь говорил об этом поведении. Я пытаюсь выяснить, является ли частичная спецификация шаблонных функций частью стандарта С++, или это специфический компилятор.
Частичной спецификацией я имею в виду указание только тех типов, которые компилятор не может вывести. Поэтому, если у меня есть функция шаблона "f", которая принимает 3 типа, а одна используется в параметре и может быть выведена, я могу назвать "f" формой f<type, type>(parameter)
Вот пример:
#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;
}
Я тестировал это с помощью g++ 4.5.3, g++ 4.6.3, VS2010 и VS2012. Поскольку он, похоже, широко поддерживается компиляторами, я уверен, что он является частью стандарта, но может ли кто-нибудь подтвердить это? У кого-нибудь есть ссылки или указатели на ресурсы, которые могли бы объяснить, почему это работает?
Спасибо