gpt4 book ai didi

c++ - 使用概念来选择类模板特化

转载 作者:行者123 更新时间:2023-12-02 16:10:52 26 4
gpt4 key购买 nike

This question演示了如何使用 C++20 概念为函数 模板选择重载。我正在尝试做一些类似的事情:为 class 模板选择 specializations

我从 Angle<T> 的类模板开始它包装一个浮点值,其中包含一个以弧度为单位的角度。使用概念,我可以确保用户不会实例化 Angle与浮点类型以外的任何东西:

template <std::floating_point T> struct Angle { T m_radians; };

后来,我决定让客户使用 Angle<T> 的独特实现。可以处理整数类型。换句话说,我想允许这样的代码:

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

模板需要声明一个足够大的域来包含它的所有特化。

关于c++ - 使用概念来选择类模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68058640/

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