如果第二个模板实例化,如何防止下面的第一个模板实例化? (即如果两者static_cast<T>(0)
and T::zero()
已定义)
template<typename T>
auto zero() ->decltype(static_cast<T>(0)) {
return static_cast<T>(0);
}
template<typename T>
auto zero() ->decltype(T::zero()) {
return T::zero();
}
如果您需要将其扩展到多个重载并对重载等级进行细粒度控制,则常见的技术是使用标签调度。
template<int r>
struct rank : rank<r - 1> {};
template<>
struct rank<0> {};
template<typename T>
auto zero_impl(rank<0>) -> decltype(static_cast<T>(0)) {
return static_cast<T>(0);
}
template<typename T>
auto zero_impl(rank<1>) ->decltype(T::zero()) {
return T::zero();
}
template<typename T>
auto zero() { return zero_impl<T>(rank<10>{}); }
派生到基类的转换将优先选择最接近的基类。这意味着调用具有最高等级的重载。因为在编译器看来,这将具有最佳的隐式转换序列。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)