通过解决各种玩具问题,我开始熟悉元编程。这是一个让我难过的问题:如何编写一个元程序,以位为单位提供整数类型参数的大小。特别是,我想在没有CHAR_BIT或任何其他幻数的情况下做到这一点。
我从以下非元程序开始:
template <typename T>
int sizeInBits(void) {
T flag = 1;
int count = 0;
while (flag != 0) {
flag <<= 1;
++count;
}
return count;
}
转换为元程序,我认为它看起来像这样:
template<typename T, int COUNT = 0, T FLAG = 1>
struct SizeInBits {
enum {Result = SizeInBits<T, COUNT + 1, FLAG << 1 >::Result};
};
template<typename T, int COUNT>
struct SizeInBits<T, COUNT, 0> {
enum {Result = COUNT};
};
但是,该程序无法编译,因为显然专注于具有模板参数类型的非类型模板参数是非法的,因此我使用 gcc 4.6 收到以下错误消息:
error: type ‘T’ of template argument ‘0’ depends on a template parameter
有任何想法吗?
编辑:
我本质上是在寻找与<climits>
and中的幻数等效的元程序<limits>
。因此,例如,我想在我的系统上给予,SizeInBits<char>::Result
并给予.8
SizeInBits<unsigned>::Result
32
关于有符号类型的左移运算符有效性的注意事项:
在评论中,当溢出发生时,是否FLAG << 1
为有符号类型定义了一些问题。根据这篇文章中引用的 C++03 标准,它被定义并执行上述算法所期望的。