Я пытаюсь выяснить, является ли частичная спецификация шаблонных функций частью стандарта C ++ или это что-то специфичное для компилятора.
Под частичной спецификацией я подразумеваю указание только тех типов, которые компилятор не может определить. Поэтому, если у меня есть шаблонная функция ‘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. Поскольку он, кажется, широко поддерживается компиляторами, держу пари, что он является частью стандарта, но может ли кто-нибудь это подтвердить? Есть ли у кого-нибудь ссылки или ссылки на ресурсы, которые могут объяснить, почему это работает?
Пункт 14.8.1.2 стандарта C ++ 03 заявляет
«Конечные аргументы шаблона, которые могут быть выведены (14.8.2), могут быть опущены из списка явных аргументов шаблона».
Других решений пока нет …