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使用上面的专业化方法将计算移动到支持模板中.
| 归档时间: |
|
| 查看次数: |
1356 次 |
| 最近记录: |