【问题标题】:Making function template parameter unsigned in C++11在 C++11 中使函数模板参数无符号
【发布时间】:2023-03-18 00:15:01
【问题描述】:

在一个看起来像这样的模板函数中:

template<typename T> constexpr T foo(T a, T b) { return /*recursive call*/; }

我收到关于比较有符号和无符号的警告(由于与 sizeof 比较),我想消除它。

从概念上讲,需要这样的东西:

template<typename T> constexpr T foo(T a, unsigned T b) { ... }
    or
template<typename T> constexpr T foo(T a, std::make_unsigned<T>::type b) { ... }

不幸的是,第一个版本不是有效的 C++,第二个版本破坏了构建,因为当编译器看到 make_unsigned 时 T 不是限定类型。

是否有实际可行的解决方案?

(注意:在某种程度上与/几乎相同Get the signed/unsigned variant of an integer template parameter without explicit traits,虽然函数而不是类(所以没有 typedefs),C++11 的特征或任何特性明确欢迎,并且有效的解决方案(即 not make_unsigned&lt;T&gt;) 首选。)

【问题讨论】:

    标签: c++ templates c++11


    【解决方案1】:

    您忘记了“类型名称”

    template<typename T>
    constexpr T foo(T a, typename std::make_unsigned<T>::type b) { ... }
    

    在 C++14 中你应该能够编写

    template<typename T>
    constexpr T foo(T a, std::make_unsigned_t<T> b) { ... }
    

    或者你可以在 C++11 中自己实现:

    template<typename T>
    using make_unsigned_t = typename std::make_unsigned<T>::type;
    

    【讨论】:

    • 我在 C++03 中遇到了类似的问题。我想要两个模板:一个用于template &lt;class unsigned T, class unsigned U&gt;,一个用于template &lt;class signed T, class signed U&gt;。我需要测试是否可以从TU 进行转换。 C++03 世界有解决方案吗? (这是否需要一个新问题)?
    • @jww 是的,我想说这应该是它自己的问题。
    猜你喜欢
    • 2015-11-27
    • 2012-11-27
    • 1970-01-01
    • 2012-02-21
    • 2012-08-14
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多