C++ 可变模板的完美转发
我目前正在研究一些新的C++17功能,特别是C++ 可变模板的完美转发,c++,variadic-templates,optional,c++17,variadic-functions,C++,Variadic Templates,Optional,C++17,Variadic Functions,我目前正在研究一些新的C++17功能,特别是std::optional,我决定尝试使用可变模板来实现最小查找函数。这就是我到目前为止所做的: 模板 Opt optional_min(Opt&&Opt){ 返回std::转发(opt); } 模板 标准::普通类型 可选最小值(Opt0&&Opt0、Opt1&&Opt1、Opts&&Opts){ 如果(!opt0&&!opt1) { 返回可选_min(std::optional(std::nullopt)、std::forward(opts)…);
std::optional
,我决定尝试使用可变模板来实现最小查找函数。这就是我到目前为止所做的:
模板
Opt optional_min(Opt&&Opt){
返回std::转发(opt);
}
模板
标准::普通类型
可选最小值(Opt0&&Opt0、Opt1&&Opt1、Opts&&Opts){
如果(!opt0&&!opt1)
{
返回可选_min(std::optional(std::nullopt)、std::forward(opts)…);
}
else if(opt0&!opt1)
{
返回可选的最小值(opt0,标准::转发(opts)…);
}
否则如果(!opt0&&opt1)
{
返回可选的最小值(opt1,std::forward(opts)…);
}
其他的
{
返回(*opt0<*opt1)?
可选最小值(opt0,标准::转发(opts)…)
:可选的最小值(opt1,标准::转发(opts)…);
}
}
int main(){
标准::可选a=9;
std::可选b=std::nullopt;
标准::可选c=4;
如果(自动x=可选的最小值(a、b、c))
std::cout可选的\u min
参数中没有一个是转发引用。它们都是右值引用
转发引用是在将参数声明为推导模板类型参数的右值引用时形成的,但这里不是这种情况。optional\u min
的参数是对推导模板参数实例化的右值引用
为了避免这种情况,只需去掉Opt0
、Opt1
和Opts
模板参数,并直接使用类型参数:
template <typename Opt0, typename Opt1, typename... Opts>
auto optional_min(Opt0&& opt0, Opt1&& opt1, Opts&&... opts) {
//...
}
模板
自动可选_min(Opt0&&Opt0、Opt1&&Opt1、Opts&&Opts){
//...
}
如果这是您的目标,您可以使用SFINAE将类型参数限制为
std::optional
的实例化。转发引用是一个类似T&
Op
的引用,它已经决定了值类别。谢谢!这非常有用。实际上,我有一个问题…如果函数被赋予了一个右值参数,ho它最终会返回对对象的引用吗?我删除了那个位。你是按值返回的,所以我完全错了。
template <typename Opt0, typename Opt1, typename... Opts>
auto optional_min(Opt0&& opt0, Opt1&& opt1, Opts&&... opts) {
//...
}