【发布时间】:2021-05-16 12:15:17
【问题描述】:
假设我有 2 个不同的结构:
struct A {
char a_name[512];
... // A struct data
}
struct B {
char b_name[256];
... // B struct data
}
给定std::string name,我需要检查容器中是否存在对象(无论是A 还是B)。由于A 和B 都以char[size] 成员开头,这是我要比较的名称,我尝试了以下操作:
// T is a template parameter which is always an object of type A or B
↓
for (const T& item : container)
if (name == reinterpret_cast<const char*>(&item))
它确实按预期工作。我读该对象时好像它是一个字符数组,但由于A.a_name 和B.b_name 保证为空终止,所以我不读我不应该读的内容……还是我读?上面的代码会产生未定义的行为吗?它会产生我没有考虑到的任何错误吗?如果是这样,我该如何处理这项任务?
我无法修改A 或B。我选择不为每个类重载 operator==,因为 A 和 B 实际上是更多不同的结构,它们具有我上面描述的结构(char[size] + 更多数据)。
【问题讨论】:
-
什么是
T?貌似A和B没有共同的基类,所以不可能T? -
重新打开问题,因为重复显然是错误的。它指出了一个问题,该问题询问
reinterpret_casting 到非 char* 类型,这会产生很大的不同。 -
// T is an object of type A or B??为何如此?您正在处理的实际容器类型是什么? -
@ChrisDodd
T表示模板函数的类型,而不是父类什么的。 A 和 B 除了第一个成员char[]之外完全不相关 -
@SergeyA 谢谢你重新打开它,我很困惑 ^^"。容器是
std::vector<T>,而 T 是模板参数。如果这样我可以提供更多的代码更清楚
标签: c++ undefined-behavior reinterpret-cast