考虑以下两个模板函数:
template <typename T, typename A>
T* create(A i) {
return new T(i);
}
template <typename T, typename A>
T* create(A i) {
return new T();
}
它们具有相同的签名,但对于给定的 T 和 A,只能实例化一次。
有没有办法将一些 SFINAE 成语应用于上述模板函数,以便当且仅当 T 具有接受 A 作为参数类型的构造函数时,可以实例化的模板函数的版本是第一个版本,否则第二个版本带有默认构造函数将被实例化,例如:
// S is given, cannot be changed:
struct S {
S(int) {}
}
int main() {
// the first template function should be instantiated since S has S(int)
create<S, int>(0); // the only call in the program
// ...
}