是否可以帮助编译器推断模板参数以避免显式专门化
代码:
模板<;类型名T,int>;
结构
{
};
模板<;typename T>;
结构A
{
模板<;整数N>;
A(S<;T,N>;)
{
}
};
模板<;typename T>;
无效foo(A<;T>;arg)
{
}
电话:
S<;国际,10>;s
A<;int>;v=s;
富<;int>;(s) )//好啊
傅(五),//好啊
傅(s);//错误C2784:“void foo(A<;T>;)”:无法推断“A<;T>;'
您可以接受任何可转换为A<;的对象&燃气轮机并在函数内部手动转换
如果没有其他的foo()重载
…你可以去
无效foo(自动t){
A arg{t};//使用这个函数,就像您在示例中使用“A<;t>;arg”一样
}
对于旧的C++版本,从下面介绍的文件中引入必要数量的黑客。
如果需要在多个模板重载中进行选择
…因此需要SFINAE,解决方案有点复杂:
void foo(auto t)requires需要{A{t};}{
一个arg{t};
}
没有C++20,就没有要求(和自动函数参数)。解决办法:
模板<;typename T>;自动foo(T)——>;标准::void\u t<;decltype(A{t})>;{
一个arg{t};
}
如果您甚至不能使用C++17,那么您就没有CTAD=>;没有A{t}(也没有std::void_t;即使它是一个单行程序,在下面的示例中,我将展示另一个旧的SFINAE技巧仅供参考)。为了解决这个问题,我建议使用STL使用的相同方法-make\uuz函数。对于C++14甚至C++11:
模板<;类型名T,内部N>;A<;T>;使A(S<;T,N>;S){returns;}
模板<;typename T>;A<;T>;使A(A<;T>;A){返回A;}
模板<;typename T>;void foo(T,decltype(make_A(T))*=nullptr){
自动参数=使_A(t);
}