decltype(s-6ren">
gpt4 book ai didi

c++ - "Inverse SFINAE"避免模棱两可的过载

转载 作者:行者123 更新时间:2023-12-01 14:34:41 25 4
gpt4 key购买 nike

如果第二个模板实例化,我如何防止下面的第一个模板实例化? (即如果同时定义了 static_cast<T>(0)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();
}

最佳答案

如果您需要通过对重载等级的细粒度控制将其扩展到多个重载,一种常见的技术是使用标记分派(dispatch)。

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>{}); }

派生到基类的转换将优先选择最接近的基类。这转化为调用具有最高级别的重载。因为在编译器看来,那将具有最佳的隐式转换序列。

关于c++ - "Inverse SFINAE"避免模棱两可的过载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60247980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com