【问题标题】:Why use boost::ice_or instead of || and boost::ice_and instead of && in enable_if?为什么使用 boost::ice_or 而不是 ||和 boost::ice_and 而不是 enable_if 中的 &&?
【发布时间】:2011-03-23 02:59:26
【问题描述】:

正如问题所述,人们是否有理由使用结构版本而不是普通条件句?

【问题讨论】:

    标签: c++ boost metaprogramming enable-if


    【解决方案1】:

    摘自Boost Coding Guidelines for Integral Constant Expressions

    不要在整型常量表达式中使用逻辑运算符;改用模板元编程。

    标题包含许多解决方法模板,它们履行逻辑运算符的角色,例如,而不是:

    INTEGRAL_CONSTANT1 || INTEGRAL_CONSTANT2

    用途:

    ::boost::type_traits::ice_or<INTEGRAL_CONSTANT1,INTEGRAL_CONSTANT2>::value

    基本原理:许多编译器(尤其是 Borland 和 Microsoft 编译器)倾向于不将涉及逻辑运算符的整型常量表达式识别为真正的整型常量表达式。该问题一般只在整数常量表达式嵌套在模板代码深处时才会出现,并且难以重现和诊断。

    所以我会说永远不要使用兼容的编译器。 (但如果你需要支持不兼容的编译器,请使用它。)

    【讨论】:

    • "尤其是 Borland 和 Microsoft 编译器" 哦,嘘...! VS210在这里。 :|感谢您提供那个 sn-p!
    • @Xeo:没问题。很遗憾他们没有列出编译器,但我真的怀疑 VC2010 需要它。
    • @Xeo - 它们肯定是指 VC6,它因使用范围太广和非常不规范而臭名昭著。 VS2010就没有这样的问题。
    • 谢谢!由于我不喜欢过多的双冒号和尖括号,这让我成为了一个快乐的程序员。 :) 如果有什么失败了,我会知道为什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2011-11-07
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多