Ale*_*x B 2 c++ templates metaprogramming
有没有办法在编译时找出整数类型的最小值/最大值的位数,以便它适合作为模板参数放置?
理想情况下,将会有一个现有的解决方案,例如Boost MPL.如果没有,我正在寻找一些手动编码解决方案的指针.
这是你想要的?
std::numeric_limits<T>::digits10
Run Code Online (Sandbox Code Playgroud)
可以无变化地表示的位数(十进制基数).
小智 5
在任何基础上使用您可以作为无符号长模板参数提供的任何值:
template<unsigned B, unsigned long N>
struct base_digits_detail {
enum { result = 1 + base_digits_detail<B, N/B>::result };
};
template<unsigned B>
struct base_digits_detail<B, 0> {
private:
enum { result = 0 };
template<unsigned, unsigned long>
friend class base_digits_detail;
};
template<unsigned B, unsigned long N>
struct base_digits {
enum { result = base_digits_detail<B, N>::result };
};
template<unsigned B>
struct base_digits<B, 0> {
enum { result = 1 };
};
Run Code Online (Sandbox Code Playgroud)
#include <climits>
#include <iostream>
int main() {
std::cout << base_digits<10, 0>::result << '\n';
std::cout << base_digits<10, 1>::result << '\n';
std::cout << base_digits<10, 10>::result << '\n';
std::cout << base_digits<10, 100>::result << '\n';
std::cout << base_digits<10, 1000>::result << '\n';
std::cout << base_digits<10, UINT_MAX>::result << '\n';
std::cout << '\n';
std::cout << base_digits<8, 0>::result << '\n';
std::cout << base_digits<8, 01>::result << '\n';
std::cout << base_digits<8, 010>::result << '\n';
std::cout << base_digits<8, 0100>::result << '\n';
std::cout << base_digits<8, 01000>::result << '\n';
std::cout << base_digits<8, UINT_MAX>::result << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
1
1
2
3
4
10
1
1
2
3
4
11
Run Code Online (Sandbox Code Playgroud)