関数のテンプレート引数を明示的に書いたかどうかで分岐する
こんな感じ。
#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
Types... はマジ便利。
この Types... を使ってオーバーロードする技には 本の虫: テンプレートパラメーターパックがゼロ個でも、Partial Orderingで考慮される みたいに、あるクラスが func 関数を持っているかどうかで分岐するなんてのもできる。素晴らし過ぎる。