【发布时间】:2021-12-30 09:17:32
【问题描述】:
我正在尝试制作一个函数模板,让我可以处理 POD 数据类型 和 字符串的原始字节。
我想出了这个有点幼稚的方法(我没有经常使用模板,而且我能够编写它们仅用于非常简单的情况):
#include <cstdio>
template<typename T>
void PrintBytes(T object)
{
unsigned char* p = reinterpret_cast<unsigned char*>(&object);
for (int i = 0; i < sizeof object; i++)
{
printf("%02x ", *p++);
}
printf("\n");
}
int main()
{
int a = 10;
PrintBytes(a); // works as expected
short b = 12;
PrintBytes(b); // works as expected
const char* foo = "ABC";
PrintBytes(foo); // works as expected, but doesn't do what I want
const char bar[] = "ABC";
PrintBytes(bar); // works as expected, but doesn't do what I want
}
输出
0a 00 00 00
0c 00
a4 ac 5b 8c f6 7f 00 00
a4 fb 7f 07 b7 00 00 00
最后两种情况的期望输出
41 42 43
41 42 43
显然,前两种情况有效,而后两种情况无效,因为foo 和bar 已经是指针,而unsigned char* p = reinterpret_cast<unsigned char*>(&object) 应该是unsigned char* p = object 而sizeof object 应该是strlen(object)。
如何使用 C++ 模板来做到这一点?我可以使用 c++17。
【问题讨论】: