专用于is_arithmetic类型和特定类型的类模板



我想实现一个模板类,具有std::is_arithmetic类型的特化,以及其他特定的vector类,例如:

struct Vector { double x = 0; double y = 0; double z = 0; };

I have try:

template<typename T, typename std::enable_if_t<std::is_arithmetic_v<T>>>
class arith { static constexpr const T zero() { return (T)0; } };
template<typename T, typename std::enable_if_t<std::is_same_v<typename T, Vector>>>
class arith { static inline Vector zero() { return Vector(); } };

这会导致"模板参数'__formal'与声明不兼容,在第二个模板

我尝试了一个泛型空类,这将是专门化的:

template<typename T, typename Enable = void>
class arith { };
template<typename T, typename std::enable_if_t<std::is_arithmetic_v<T>>>
class arith { static constexpr const T zero() { return (T)0; } };
template<typename T, typename std::enable_if_t<std::is_same_v<typename T, Vector>>>
class arith { static inline Vector zero() { return Vector(); } };

但是在这种情况下,两个特化都无法编译,模板参数'Enable'与声明'不兼容

我还尝试了Vector类的完全专门化,以及各种其他解决方案…没有成功。我可以通过对每种类型的完全专门化来做到这一点,但不能使std::is_arithmetic版本工作。

正确的语法如下所示。注意,当部分专门化一个类模板时,您没有使用template-id.

//------------------vvvv---->this is a non-type parameter
template<typename , auto >
class arith;
template<typename T, typename std::enable_if_t<std::is_arithmetic_v<T>> U>
//---------vvvvv------------------------------------------------------->note this 
class arith<T,U> { static constexpr const T zero() { return (T)0; } };
template<typename T, typename std::enable_if_t<std::is_same_v<T, Vector>> U>
//---------vvvvv------------------------------------------------------>note this
class arith<T,U> { static inline Vector zero() { return Vector(); } };

演示工作

在c++ 20之前,使用启用器的方法是这样的:

template<typename T, typename Enable = void>
class arith;
template<typename T>
class arith<T, std::enable_if_t<std::is_arithmetic_v<T>>>
{
static constexpr const T zero() { return (T)0; }
};
// No need of SFINAE here: fully specialized
template<>
class arith<Vector> { static inline Vector zero() { return Vector(); } };

在c++ 20中,可以使用

概念
template<typename T>
class arith;
template<typename T>
requires (std::is_arithmetic_v<T>)
class arith<T>
{
static constexpr const T zero() { return (T)0; }
};
// No need of SFINAE here: fully specialized
template<>
class arith<Vector> { static inline Vector zero() { return Vector(); } };

演示

相关内容

  • 没有找到相关文章

最新更新