如何消除模板代码中的"除以0"错误

Mar*_*som 12 c++ templates divide-by-zero visual-studio-2013

我使用一对整数模板参数来指定比率,因为我不能使用double作为模板参数.转换为双精度可以防止零三进制.这在早期版本的编译器中有效,但Visual Studio 2013出现错误:

error C2124: divide or mod by zero
Run Code Online (Sandbox Code Playgroud)

这是代码的简化版本:

template<int B1, int B2>
class MyClass
{
    const double B = (B2 == 0) ? 0.0 : (double) B1 / (double) B2;
    // ...
};

MyClass<0, 0> myobj;
Run Code Online (Sandbox Code Playgroud)

我真的希望B在零时使用它的表达式进行优化,所以我需要单行定义.我知道我可以使用模板参数<0, 1>来解决它,但我想知道是否有办法说服编译器我的表达式是安全的?

Ton*_*roy 15

我被告知的工作:

 const double B = (B2 == 0 ? 0.0 : (double) B1) /
                  (B2 == 0 ? 1.0 : (double) B2);
Run Code Online (Sandbox Code Playgroud)

这避免了依赖短路评估来防止除以0; 在分割之前进行条件选择.


最初的想法/也许是这样的......?(我认为B应该是static const或者constexpr,但我相信你可以那样......)

template<int B1, int B2>
struct MyClass
{
    const double B = (double) B1 / (double) B2;
};

template <int B1>
struct MyClass<B1, 0>
{
    const double B = 0.0;
};
Run Code Online (Sandbox Code Playgroud)

如果您想要其他许多内容MyClass并且不想复制或放入基础等,您可以B使用上面的专业化方法将计算移动到支持模板中.