【问题标题】:Template distinguish between signed and unsigned模板区分有符号和无符号
【发布时间】:2019-09-17 08:43:49
【问题描述】:

如果已经编写了一个模板函数,并且代码只有在模板类型未指定的情况下才能正常工作。 现在我正在寻找一种方法来防止函数在没有 C++11 的情况下使用签名类型进行编译。

template<typename T>
T foo() {
    T a=0;
    return a<<1;
}

【问题讨论】:

    标签: c++ templates c++98


    【解决方案1】:

    std::is_signed 仅从 C++11 开始可用,但在您可以使用 std::numeric_limits&lt;T&gt;::is_signed 之前。

    由于static_assert 也是 C++11,你必须使用其他东西,例如 here 的技巧:

    typedef int static_assert_something[something ? 1 : -1];
    

    【讨论】:

    • 是的,这会做得很好!
    【解决方案2】:

    没有库:对于有符号类型,~T(0) &lt; T(0),但对于无符号类型,~T(0) &gt; T(0)。这些是编译时常量。请参阅the other answer 如何将其变为错误。

    【讨论】:

      猜你喜欢
      • 2012-03-06
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 2017-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多