gpt4 book ai didi

c++ - 如何避免在此模板代码中出现有关被零除的警告?

转载 作者:可可西里 更新时间:2023-11-01 17:52:34 25 4
gpt4 key购买 nike

我有一个定点运算类,这是其中的主要部分:

template <typename I, I S>
struct fixed
{
I value;

fixed(I i) : value(i * S) {}

template <typename J, J T> fixed(const fixed<J, T> &fx)
{
if (S % T == 0)
value = fx.value * (S / T);
else if (T % S == 0)
value = fx.value / (T / S);
else
value = S * fx.value / T;
}

static_assert(S >= 1, "Fixed-point scales must be at least 1.");
};

在 GCC 4.4.5 上,以下代码行:

fixed<int, 8> f = fixed<int, 2>(1);

产生一个错误:

fixed.hpp: In constructor ‘fixed<I, S>::fixed(const fixed<J, T>&) [with J = int, J T =     2, I = int, I S = 8]’:
fixed.hpp:81: error: division by zero

虽然代码中有除以常数零的情况 - 对于不等比例,T/S 或 S/T 之一必须为零 - 如果 S%T == 0(并且 S 不为 0),则 S/T不为零。 GCC 似乎做了足够的优化来确定我的一个分支保证除以零,但没有足够的优化来确定该分支保证不运行。

我可以在文件中抛出 #pragma GCC diagnostic ignored "-Wdiv-by-zero",但这有掩盖真实警告的风险。

处理这种情况的合适方法是什么? (或者我的分析完全错误,我确实有一个真正的运行时除以零?)

最佳答案

像什么?

template<int,int>
struct helper {
static int apply(...) { return S * fx.value / T; }
};

template<int n>
struct helper<0,n> { // need 0,0 as well to avoid ambiguity
static int apply(...) { return fx.value * (S / T); }
};

template<int m>
struct helper<m,0> {
static int apply(...) { return fx.value / (T / S); }
};

helper<(S % T == 0), (T % S == 0)>::apply(...);

或使用 mpl::bool_,您可以通过参数“专门化”函数。

关于c++ - 如何避免在此模板代码中出现有关被零除的警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5217811/

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