使用遗留代码(使用reinterpret_cast)真的是一种很好的技术吗?

Tie*_* Do 2 c++

下面的代码来自于一个关于C++的面试问题后这里.我从来不知道这种技术:)(虽然它声称是一个很好的:)).我的问题是:我们需要在哪种情况下使用它?您是否经常在真实的生产/遗留代码中看到它?

题:

为任何给定的Something*对象实现一个获取topSecretValue的方法.该方法应该是跨平台兼容的,不依赖于sizeof(int,bool,string).

class Something {
    Something() {
        topSecretValue = 42;
    }
    bool somePublicBool;
    int somePublicInt;
    std::string somePublicString;
private:
    int topSecretValue;
};
Run Code Online (Sandbox Code Playgroud)

回答:

创建另一个类,它具有相同顺序的Something的所有成员,但具有返回值的其他公共方法.您的副本类似于以下内容:

class SomethingReplica {
public:
    int getTopSecretValue() { return topSecretValue; } // <-- new member function
    bool somePublicBool;
    int somePublicInt;
    std::string somePublicString;
private:
    int topSecretValue;
};

int main(int argc, const char * argv[]) {
    Something a;
    SomethingReplica* b = reinterpret_cast<SomethingReplica*>(&a);
    std::cout << b->getTopSecretValue();
}
Run Code Online (Sandbox Code Playgroud)

在最终产品中避免这样的代码很重要,但在处理遗留代码时它仍然是一种很好的技术,因为它可以用来从库类中提取中间计算值.(注意:如果事实证明外部库的对齐与您的代码不匹配,您可以使用#pragma pack解决此问题.)

Chu*_*huu 7

你可以不用这样做reinterpret_cast.在以下博客文章中概述了使用模板和朋友的技巧,演示了该技术:

访问私人会员.这很简单!

这肯定比采访者的方法更安全,因为它消除了重新创建类定义时的人为错误.但这种方法是否很好?给定的问题有一些令人难以置信的人为约束,很少适用于"真正的"项目.如果它是一个C++项目并且您可以访问头文件,为什么不添加一个getter?如果它不是C++项目,为什么你在interop类的定义中如此受限?

  • 还有为此而存在的库.我对他们的宏少解决方案印象特别深刻:https://github.com/hliberacki/cpp-member-accessor (5认同)