是否可以在没有显式专门化的情况下推断模板参数?

是否可以帮助编译器推断模板参数以避免显式专门化

代码:

模板<类型名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);
}

发表评论