如果第二个模板实例化,如何防止下面的第一个模板实例化? (即是否同时定义了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();
}
template <typename T>
auto zero_helper(char) -> decltype(static_cast<T>(0))
{
return static_cast<T>(0);
}
template <typename T>
auto zero_helper(int) -> decltype(T::zero())
{
return T::zero();
}
template <typename T>
auto zero() -> decltype(auto)
{
return zero_helper<T>(0);
}