用于指定任何无符号整数类型的 C++ 模板特征

Jim*_*Eli 6 c++ templates traits unsigned-integer

I\xe2\x80\x99m 尝试实现一个仅接受无符号整数类型的函数。以下是我迄今为止尝试过的。它适用于“unsigned int”,但为什么 \xe2\x80\x99t 不能编译为“unsigned Short”?

\n\n
#include <iostream>\n#include <type_traits>\n\ntemplate<typename T, class = typename std::enable_if<std::is_unsigned<T>::value>::type>\ninline const T oddProduct(T n) noexcept {\n    return (n <= 1) ? n : (n % 2) ? oddProduct(n - 2)*n : oddProduct(--n);\n}\n\nint main() {\n    std::cout << "Product of odd integers from 1 to 15: " << oddProduct<unsigned short>(15) << std::endl;\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意:MSVS 2017 社区 C++14 选项。

\n

Edg*_*jān 5

问题是,由于积分促销

n - 2
Run Code Online (Sandbox Code Playgroud)

有一种类型int不是unsigned.

您可以尝试添加static_cast

template<typename T, class = typename std::enable_if<std::is_unsigned<T>::value>::type>
inline const T oddProduct(T n) noexcept {
    return (n <= 1) ? n : (n % 2) ? oddProduct(static_cast<T>(n - 2))*n : oddProduct(--n);
                                               ^^^^^^^^^^^^^^
}
Run Code Online (Sandbox Code Playgroud)

当您调用时,son - 2会被转换为.unsigned shortoddProduct<unsigned short>

另一种可能的选择是更改22U.


另请注意,一旦您使用C++14,您可能会使用std::enable_if_t

class = typename std::enable_if_t<std::is_unsigned<T>::value>
Run Code Online (Sandbox Code Playgroud)

演示版

  • 另请注意,从 C++17 开始,您可以将 `std::is_unsigned&lt;T&gt;::value` 替换为 `std::is_unsigned_v&lt;T&gt;`。 (2认同)