gpt4 book ai didi

c++ - 确定模板中临时文件的大小

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:05 25 4
gpt4 key购买 nike

我有一个模板类需要能够在一个类型的两个实例之间进行插值。所以我的类调用一个名为 interpolate 的用户提供的函数,具有以下签名:

template<typename T>
T interpolate(uint32_t distance, const T& from, const T& to);

此处,distance00xFFFF

现在,我想为 T 的常见类型提供合理的实现,例如 uint32_t。所以我写了一个示例实现(忽略它只为签名类型实现):

template<typename T>
inline auto interpolate(uint32_t distance, const T& from, const T& to)
-> std::enable_if_t<std::is_signed<T>::value, T>
{
return from + ((distance * (to - from)) / 0xFFFF);
}

这适用于小于 32 位的类型,因为距离永远不会大于 16 位的值,distance * (to - from) 的结果是 uint32_t。但是 32 位不足以包含例如 0xFFFF * uint32_t 的结果——在这种情况下,模板需要一个 64 位的临时文件。

有没有一种标准化的方法可以让我选择一个比 T“更大”的类型来保存临时结果?显然这只需要对内在类型起作用;用户的类型仍然需要他们自己的interpolate 实现。

最佳答案

首先,正如您所说,您的插值因子只能从 0 到 0xFFFF。你应该有一个反射(reflect)这一点的类型,以尽量减少潜在的错误——即不要使用 uint32_t,而是使用 uint16_t。根据经验,您应该避免在参数中使用超过您需要的参数。所以一般的签名是:

template<typename T>
T interpolate(uint16_t factor, const T& from, const T& to);

请注意,在进行插值时,结果可能会超出范围 [from; to] - 因此,接口(interface)中不需要更大的类型。

现在,您正在使用整数插值使您的生活复杂化。我不知道你到底为什么不想要浮点插值(尤其是对于动画框架,我们已经不是 1995 年了!)。

因此,如果您真的想以整数形式执行它,那么您将需要一个更大的整数来保存它。您可以做的最简单的事情:

template<typename I> struct bigger_integer;
template<> struct bigger_integer<int8_t> { typedef int16_t type; };
template<> struct bigger_integer<int16_t> { typedef int32_t type; };
template<> struct bigger_integer<int32_t> { typedef int64_t type; };
template<> struct bigger_integer<uint8_t> { typedef uint16_t type; };
template<> struct bigger_integer<uint16_t> { typedef uint32_t type; };
template<> struct bigger_integer<uint32_t> { typedef uint64_t type; };

并且,在您的函数中,使用以下更大的类型:

using I = std::make_signed_t<typename bigger_integer<T>::type>;

即使对未签名的类型稍作修改,它也应该可以工作。

我的意见:使用 double 。如果在分析 session 后发现它们导致性能问题,那么您可以尝试优化它们。但老实说,我怀疑情况会如此。这里的代码更简单:

template<typename T>
T interpolate(uint16_t factor, const T& from, const T& to)
{
return T(double(from) + double(factor) * (double(to) - double(from)) / double(0xFFFF));
}

Live example here .

关于c++ - 确定模板中临时文件的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35051394/

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