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}\nRun Code Online (Sandbox Code Playgroud)\n\n注意:MSVS 2017 社区 C++14 选项。
\n问题是,由于积分促销:
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>
另一种可能的选择是更改2为2U.
另请注意,一旦您使用C++14,您可能会使用std::enable_if_t:
class = typename std::enable_if_t<std::is_unsigned<T>::value>
Run Code Online (Sandbox Code Playgroud)