関数のテンプレート引数を明示的に書いたかどうかで分岐する

こんな感じ。

#include <iostream>
 
template<class T>
struct identity
{
    typedef T type;
};
 
template<class T>
void f(typename identity<T>::type)
{
    std::cout << "type T" << std::endl;
}
 
template<class T, class... Types>
void f(T, Types...)
{
    std::cout << "deduced" << std::endl;
}
 
int main()
{
    f<int>(10);
    f(10);
}
type T
deduced

明示的に書いたときは両方の関数が候補に挙がって、f(T) と f(T, Types...) なら f(T) の方が優先されるので前者が呼ばれて、明示的に書かなかったときはそもそも identity::type の効果によってこの関数が候補に挙がらないと。
Types... はマジ便利。
この Types... を使ってオーバーロードする技には 本の虫: テンプレートパラメーターパックがゼロ個でも、Partial Orderingで考慮される みたいに、あるクラスが func 関数を持っているかどうかで分岐するなんてのもできる。素晴らし過ぎる。