次の関数テンプレートがあるとします。
#include <vector>
#include <utility>
struct Base { };
struct Derived : Base { };
// #1
template <typename T1, typename T2>
void f(const T1& a, const T2& b)
{
};
// #2
template <typename T1, typename T2>
void f(const std::vector<std::pair<T1, T2> >& v, Base* p)
{
};
次のコードが常にオーバーロード #2 ではなくオーバーロード #1 を呼び出すのはなぜですか?
int main()
{
std::vector<std::pair<int, int> > v;
Derived derived;
f(100, 200); // clearly calls overload #1
f(v, &derived); // always calls overload #1
return 0;
}
f
の 2 番目のパラメーターが の派生型であることを考えると、Base
オーバーロード #1 のジェネリック型よりも一致するオーバーロード #2 をコンパイラが選択することを期待していました。
これらの関数を書き直して、ユーザーがmain
関数に表示されるようにコードを記述できるようにするために使用できる手法はありますか (つまり、引数の型のコンパイラ推定を利用します)。