具有隐式转换的模板函数参数推导
Template function argument deduction with an implicit conversion
我了解模板函数参数推导不考虑隐式转换。
所以这段代码无法编译:
#include <iostream>
template<class T>
struct A {};
struct B : public A<int> {};
struct C {
operator B() { return {}; }
};
template<class X>
void test(A<X> arg1, A<X> arg2) {
std::cout << "ok1";
}
int main() {
B b;
C c;
test(b, c); // error: no matching function for call to 'test'
}
我不明白的是,如何通过 身份 typedef
添加额外的间接级别使其工作:
#include <iostream>
template<class T>
struct A {};
struct B : public A<int> {};
struct C {
operator B() { return {}; }
};
template<typename U> struct magic { typedef U type; };
template<class T> using magic_t = typename magic<T>::type;
template<class X>
void test(A<X> arg1, A<X> arg2) {
std::cout << "ok1";
}
template<class X>
void test(A<X> arg3, magic_t<A<X>> arg4) {
std::cout << "ok2";
}
int main() {
B b;
C c;
test(b, c); // prints "ok2"
}
magic_t<A<X>>
如何匹配 C
?
第二个参数变为non-deduced context,不参与模板实参推导。 X
然后从第一个参数成功推导出来。
我了解模板函数参数推导不考虑隐式转换。
所以这段代码无法编译:
#include <iostream>
template<class T>
struct A {};
struct B : public A<int> {};
struct C {
operator B() { return {}; }
};
template<class X>
void test(A<X> arg1, A<X> arg2) {
std::cout << "ok1";
}
int main() {
B b;
C c;
test(b, c); // error: no matching function for call to 'test'
}
我不明白的是,如何通过 身份 typedef
添加额外的间接级别使其工作:
#include <iostream>
template<class T>
struct A {};
struct B : public A<int> {};
struct C {
operator B() { return {}; }
};
template<typename U> struct magic { typedef U type; };
template<class T> using magic_t = typename magic<T>::type;
template<class X>
void test(A<X> arg1, A<X> arg2) {
std::cout << "ok1";
}
template<class X>
void test(A<X> arg3, magic_t<A<X>> arg4) {
std::cout << "ok2";
}
int main() {
B b;
C c;
test(b, c); // prints "ok2"
}
magic_t<A<X>>
如何匹配 C
?
第二个参数变为non-deduced context,不参与模板实参推导。 X
然后从第一个参数成功推导出来。