【发布时间】:2015-11-30 14:49:53
【问题描述】:
我想知道是否可以通过对类型的一些限制进行转发,以便自动重载。例如,假设我有以下基本功能:
int f(A a, B b)
{
return g(a) + h(b);
}
其中A 和B 是包含所有正确复制和移动构造函数的类,g 和h 是函数,每个函数都有两个重载:int g(const A&)、int g(A&&) 和h 相同。在f 中转发a 和b 的常用方法是
template <typename T1, typename T2>
int f(T1&& a, T2&& b)
{
return g(std::forward<T1>(a)) + h(std::forward<T2>(b));
}
但是,我还想添加另一种使用此功能的方式:
int f(B b, A a)
{
return g(a) + h(b);
}
如果我尝试将此重载使用转发,则生成的模板函数将如下所示:
template <typename T1, typename T2>
int f(T1&& b, T2&& a)
{
return g(std::forward<T1>(a)) + h(std::forward<T2>(b));
}
这将与第一个模板发生冲突。
所以我的问题是,当我编写一个模板函数进行转发时,我是否可以约束T1和T2,以便在第一次重载时,T1只能绑定到const A&和A&&,而如果T1 是const B& 或B&&,则可以触发第二个重载?
如果没有这种机制,我需要显式编写 8 个重载。
注意:我想我可以在这个玩具示例中使用来自type_traits 的一些模板做一些事情(有点讨厌),但我想先知道是否有更简单的方法,因为实际上,重载可能与这个玩具示例中的不同。
【问题讨论】:
标签: c++ templates c++11 move-semantics perfect-forwarding