确定变量的类型并在sizeof()中使用它
C++ Determine the type of a variable and use it within sizeof()
我想用c++写一个宏,它会给表的每个元素赋值0。例如,将i
声明为:int i[10];
,宏fill_with_zeros(i)
将产生如下效果:
i[0] = 0;
i[1] = 0;
等。
这是它的代码:
#define fill_with_zeros(xyz)
for(int l = 0 ; l < sizeof(xyz) / sizeof(int) ; l++)
xyz[l] = 0;
问题是,我希望它工作与多种类型的表:char, int, double等。为此,我需要一个函数来确定xyz
的类型,这样我就可以使用sizeof(typeof(xyz))
来代替sizeof(int)
。
存在类似的线程,但人们通常希望打印类型名称,而我需要在sizeof()中使用名称。有什么办法吗?
Thanks in advance
为什么你认为你需要一个宏?这应该可以工作:
// Beware, brain-compiled code ahead!
template< typename T, std::size_t sz >
inline void init(T (&array)[sz])
{
std::fill( array, array+sz, T() );
}
我希望我的std库实现优化std::fill()
,在T
允许的情况下自己调用std::memset()
(或类似的东西)。
注意,这实际上并没有将元素归零,而是使用默认构造的对象进行初始化。这对所有可以归零的类型都实现了相同的效果,并且可以处理许多不能归零的类型。
为什么不用memset(xyz, 0, sizeof(xyz));
呢?
数组的长度可以确定为sizeof(xyz) / sizeof(xyz[0])
。但是,已经有ZeroMemory
和memset
函数可以做您想做的事情。
#define fill_with_zeroes(arr)
for (int l = 0; l < sizeof(arr) / sizeof(arr[0]); l++)
arr[l] = 0;
或者直接调用memset(arr, 0, sizeof(arr));
我建议使用memset或者int I [10] = {0};
为什么不直接使用<cstring>
中的std::memset
呢?这就是它的设计目的,并且在大多数情况下工作得更快。
int i[10];
memset (i, 0, sizeof (i));
您应该像其他人建议的那样使用memset
,但如果您真的想走宏路线:
#define fill_with_zeros(xyz)
for(size_t l = 0 ; l < sizeof(xyz) / sizeof(xyz[0]) ; l++)
xyz[l] = 0;
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- C :用sizeof()operator在for for loop中增加一个int变量,只能工作一次
- 为什么在 sizeof() 函数中与 * 运算符一起使用和不使用 * 运算符时,指向结构变量的指针大小会有所不同?
- 返回取决于sizeof的变量类型..参数包
- 正在确定boost变量中的最大sizeof()
- 在 typedef 上使用 sizeof 而不是局部变量
- sizeof没有返回LPVOID变量的正确大小
- sizeof可以应用于未捕获的变量的lambda内部吗?还是这是一个编译器错误?
- 确定变量的类型并在sizeof()中使用它
- 为什么字符串变量的sizeof()总是返回相同的数字,即使内容发生了变化
- 为什么sizeof(带有字符变量的类)在c++中是异常的