func(10) と func(10) で呼び出される関数を分ける

例えば、こんな感じに『引数から型推論を行う関数』を呼び出す時に『テンプレート型を明示的に定義したかどうか』で呼び出される関数を別々にしたい場合があります。

template<typename T>
void
func(T&& t);

// func(10) と func<int>(10) で呼び出す関数を別々にしたい
func(10);
func<int>(10);


これ、どうやればいいのかなーと考えていたらこんな感じで出来るみたい。

[ソース]

#include <type_traits>
#include <iostream>

template<typename T>
void
func(T t){
    std::cout << "non template" << std::endl;
}

template<typename T>
void
func(typename std::common_type<T>::type t){
    std::cout << "template" << std::endl;
}


int
main(){
    int n = 10;

    func(n);
    func(10);
    func(0.25f);

    func<int>(n);
    func<int>(10);
    func<float>(n);
    func<float>(10);
    func<float>(0.25f);
    return 0;
}

[出力]

non template
non template
non template
template
template
template
template
template


久々に目からうろこだわ。