В следующем примере вывод типа завершается неудачно для вызова mkPair2
:
#include <functional>
template <class A, class B>
struct Pair {
A left; B right;
};
template <class A, class B>
Pair<A,B> mkPair1 (A left, B right) {
return (Pair<A,B>) { left, right };
}
template <class A, class B>
std::function<Pair<A,B>(B)> mkPair2 (A left) {
return [left] (B right) {
return (Pair<A,B>) { left, right };
};
}
Pair<int, char> ex1 = mkPair1 (2, 'a');
Pair<int, char> ex2 = mkPair2 (2) ('a');
Проблема в том, что mkPair2
имеет два аргумента шаблона, но вызов (2)
предоставляет толькоодин из них, поэтому компилятор немедленно поднимает руки и решает, что программа неоднозначна, хотя второй тип может быть выведен из следующего вызова ('a')
.
Это можно решить, дав компиляторутипы вручную mkPair2<int,char> (2) ('a')
, но при такой необходимости держать компилятор за руку очень быстро стареет.
Есть ли способ заставить компилятор продолжать проверку типов при условии, что каждый тип в конечном итоге будет разрешен?