I tried to find a short quote from the standard, but I do not think it is. The fact is that there is no such partial specialization of the template function (or, for that matter, the template alias). Class templates may have partial specialization.
Forget about patterns in a second. In C ++, there is a big difference between class names and function names. There can only be one class definition within a given area. (You may have different declarations, but they all refer to One True Class.) Thus, the name really identifies the class.
The name of the function, on the other hand, is a kind of group identifier. You can define any number of functions within an area with exactly the same name. When you use a function name to call a function, the compiler must figure out what function you really had in mind, considering the various possibilities and selecting the signature of each of them with the arguments provided. There is no connection between the various functions that share the name; they are completely separate entities.
So it doesn’t matter. You all knew that, huh? But now back to the templates.
The name of the template class is still unique. Although you can define partial specialization, you need to explicitly specialize the same template class. This mechanism looks externally like the above-mentioned algorithm for resolving function names, but there are significant differences - one of them is that, unlike function prototypes, you cannot have two class templates in the same area with different types of template parameters.
Sampled functions, on the other hand, do not need to define unique names. Templating does not replace the normal function overload mechanism. Therefore, when the compiler tries to find out what the name of the function means, it must take into account all the template and non-template declarations for this function name, allow the template for a set of template parameter assignments (if possible), and then after that have a list of possible function objects, select the best with normal overload resolution.
This is a completely different algorithm from the template resolution of the template template. Instead of just comparing the list of provided template arguments with the list of parameters of the declared template, how it resolves class templates, it should take every template function that could match (for example, it has at least the right number of parameters); derive template parameters by combining the provided arguments with the template; and then add the permit specialization to the overload set for the next round of overload resolution.
I believe that partial resolution of specialization could also be added to this process, but the interaction between partial specialization and function overloading attacked me, which can lead to pseudo-magic behavior. In this case, this was not necessary, and therefore, such a mechanism does not exist. (You can completely specialize the function template. Full specialization means that there are no template arguments to output, so this is not a problem.)
So to scoop: you cannot partially specialize a template function, but there is nothing that will prevent you from providing any number of function templates with the same name. All of them will be considered when resolving overload, and the best, as usual, will win.
Usually this is really enough for your overloads. You should think of template functions the same way you think of normal functions: come up with a way to choose the one you want based on the arguments provided. If you feel that you really need to provide template parameters in the function call, instead of displaying them, just make function a (possibly static) a member of the template template and put the template arguments to the class.
Hope this helps ...