当前位置:  开发笔记 > 编程语言 > 正文

std :: forward转发的重载函数

如何解决《std::forward转发的重载函数》经验,为你挑选了1个好方法。

我想知道是否可以对类型进行一些限制的转发,以便自动进行重载。例如,假设我具有以下基本功能:

int f(A a, B b)
{
    return g(a) + h(b);
}

其中,AB是包含所有适当的复制和移动构造函数和类gh一些函数各自有两个重载:int g(const A&)int g(A&&),和相同的h。通常的方式转发a,并bf

template 
int f(T1&& a, T2&& b)
{
    return g(std::forward(a)) + h(std::forward(b));
}

但是,我还要添加另一种使用此功能的方法:

int f(B b, A a)
{
    return g(a) + h(b);
}

如果我尝试在此过载下使用转发,则生成的模板函数将如下所示:

template 
int f(T1&& b, T2&& a)
{
    return g(std::forward(a)) + h(std::forward(b));
}

它将与第一个模板发生冲突。

所以我的问题是,当我编写用于转发的模板函数时,可以约束T1T2以便在第一个重载T1中只能绑定到const A&A&&,而如果T1is const B&或is 可以触发第二个重载B&&

没有这种机制,我将需要显式编写8个重载。

注意:我想我可以使用type_traits此玩具示例中的某些模板做某事(有点讨厌),但我想先知道是否有一种更简单的方法,因为实际上,重载可能比此玩具大得多例。



1> Barry..:

我可以约束T1和T2,以便在第一次重载时,T1只能绑定到const A&A&&吗?

是。这个概念称为SFINAE(替代失败不是错误),基本上看起来像这样:

template >::value>* = nullptr
          >
int f(T1&& a, T2&& b);

如果T1不“衰减”到A,则enable_if_t<>类型将格式错误,并且将抛出此重载。

如果太冗长,可以写一个别名:

template 
using enable_if_decays = std::enable_if_t>::value>;

 template * = nullptr>
 int f1(T1&& a, T2&& b);

 template * = nullptr>
 int f1(T1&& b, T2&& a);

 // etc.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有