这个问题演示了如何使用C++20概念为函数模板选择重载。我试图做一些类似的事情:为类模板选择专门化。
template <std::floating_point T> struct Angle { T m_radians; };
const auto theta = Angle<float>(3.14f);
const auto phi = Angle<int>(180);
template <std::integral T> struct Angle { T m_degrees; };
编译器将此附加实现视为使用不同约束对模板的重新声明。我尝试了几种不同的方式来表达我的意图,但没有一种能满足我所尝试的编译器。事实上,我甚至无法用std::enable_if
和传统的SFINAE实现这一点--诚然,我完全有可能不太理解SFINAE。
我发现的唯一方法需要对每种整型和浮点型进行不同的专门化。
template <std::floating_point T> struct AngleRad { T m_radians; };
template <std::integral T> struct AngleDeg { T m_degrees; };
template <typename T> struct Angle2 {};
template <> struct Angle2<float> : public AngleRad<float> {};
template <> struct Angle2<double> : public AngleRad<double> {};
template <> struct Angle2<long double> : public AngleRad<long double> {};
template <> struct Angle2<short> : public AngleDeg<short> {};
template <> struct Angle2<int> : public AngleDeg<int> {};
template <> struct Angle2<long> : public AngleDeg<long> {};
template <> struct Angle2<long long> : public AngleDeg<long long> {};
template <> struct Angle2<unsigned short> : public AngleDeg<unsigned short> {};
template <> struct Angle2<unsigned int> : public AngleDeg<unsigned int> {};
template <> struct Angle2<unsigned long> : public AngleDeg<unsigned long> {};
template <> struct Angle2<unsigned long long> : public AngleDeg<unsigned long long> {};
[是的,我知道还有几种整数类型。我只是想说明一下这一点。这个例子是为了简单起见而设计的,尽管它是受实际代码的启发。]
有没有一种方法可以用概念来更简单地表达这一点?
你说
template<typename T> // requires (std::integral<T> || std::floating_point<T>) // optional
struct Angle;
template<std::integral T> struct Angle<T> { T m_degrees; };
template<std::floating_point T> struct Angle<T> { T m_radians; };
模板需要用一个足够大的域来声明,以包含它的所有专门化。
请向我解释选择模板专用化的规则。我举一个例子: 为什么输出为?一般来说,专用类中的默认模板参数会发生什么情况?它会带来一些影响吗?
还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案
约束类型名J与类型名U相同的好方法是什么?
关于下一个代码,我有一些问题: > 类专业化
我有一个通用算法,需要访问其模板类型的特征。有一个特征类可以专门用于提供这些特征。 在我的类中使用此算法时,我想将其与类中定义的私有类型一起使用。 然而,专门化只能发生在或全局范围内,而我的类是不可访问的。 是否有可能以某种方式专门化具有私有类型的模板,至少在可访问此类型的范围内? 也许可以将这个专门化声明为一个类?