考虑我的实现返回
的类型struct first_struct { TKey key; TValue value;}
界面(它是一个家庭作业)要求
的类型struct pair { TKey first; TValue second;}
我实现了接口迭代器:
...
pair& operator*() const {
return *reinterpret_cast<pair*>(&*iter); // smooth?
}
private:
Implementation::iter; // operator* returns `first_struct&`, it's my implementation
这真的是最干净的方法吗?
我还考虑过将转换运算符从first_struct
转换为pair&
,但是1)first_struct不应该关心2)在运算符中,我不知道如何将pair的数据成员指向first_struct成员'位置,也可以通过赋值将数据成员作为值类型,而不是引用。
编辑:
这会导致BAD_ACCESS,就像Dan M.在评论中指出的那样,未定义的行为。 reinterpret_cast - cppreference(我希望我理解得很好)
但我查看了标准草案(因为在cppreference他们提到的(在类型别名段落中)char是异常,但没有关于char *(我在类似情况下在代码中的其他地方使用)。 在standard draft - github
8.5.1.10重新解释演员表
§7可以将对象指针显式转换为不同类型的对象指针。当对象指针类型的prvalue v转换为对象指针类型“指向cv T的指针”时,结果为static_cast(static_cast(v))。
§11如果类型为“指向T1的指针”的表达式可以显式转换为“指向T2的指针”类型,则指定对象x的类型T1的glvalue表达式可以转换为“对T2的引用”类型使用reinterpret_cast。结果是* reinterpret_cast(p),其中p是指向x类型的指针 “指向T1的指针。”
并且没有任何未定义的行为。如果static_cast<cv T*>(static_cast<cv void*>(v))
没有导致它(我希望)。所以它应该工作。我错过了什么或者cppreference是错的,还是标准太新了?