gpt4 book ai didi

c++ - float 模板特化

转载 作者:太空狗 更新时间:2023-10-29 20:37:07 24 4
gpt4 key购买 nike

我知道,我不能在模板中使用 float 作为非类型参数。所以我想为我的极限等级使用一个分子和一个分母。

我的极限类有一个类型以及最小值和最大值。要对 int 和 float 使用 Limit,我目前使用这个:

template <typename U, typename T = U, T A1 = 0, T A2 = 0, T A3 = 0, T A4 = 0>
struct Limit {
static constexpr const U min = A1;
static constexpr const U max = A2;
};

template <intmax_t A1, intmax_t A2, intmax_t A3, intmax_t A4>
struct Limit<float, intmax_t, A1, A2, A3, A4> {
static constexpr const float min = A1 / (float) A2;
static constexpr const float max = A3 / (float) A4;
};

Limit<float, intmax_t, 40, 20, 30, 40> a;

Limit<int, 10, 20> b;

有什么方法可以优化这个实现吗?也许为 float 实现启用默认值?

提前致谢!

编辑:我想要一个像这样的模板声明(不工作):

// For int, char, short, uint32_t etc...
template <typename U, U MIN, U MAX>
struct Limit {
static constexpr const U min = MIN;
static constexpr const U max = MAX;
};

// For float/double
template <typename T /*float or double*/, typename MIN, typename MAX>
struct Limit {
static constexpr const T min = MIN.num / (T) MIN.dem; // static cast...
static constexpr const T max = MAX.num / (T) MAX.dem; // static cast...
};

Limit<int, int, 10, 20> a;

Limit<float, std::ratio<4,5>, std::ratio<10,15>> b;

最佳答案

我认为你的实现尖叫着使用 std::ratio .您可以使用两个原始的 std::ratio 作为您的 minmax 或如下所示的一些实现:

template<typename U, std::intmax_t NumerMin = 0, std::intmax_t DenomMin = 1,
std::intmax_t NumerMax = 0, std::intmax_t DenomMax = 1>
struct Limit {
static const std::ratio<NumerMin, DenomMin> min_;
static const std::ratio<NumerMax, DenomMax> max_;
public:
U const min = static_cast<U>(min_.num) / static_cast<U>(min_.den);
U const max = static_cast<U>(max_.num) / static_cast<U>(max_.den);
};

Live Demo

关于c++ - float 模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36007974/

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