【问题标题】:C++: Is there a way to make this reflection macro work with IntelliSense?C++:有没有办法让这个反射宏与 IntelliSense 一起工作?
【发布时间】:2014-11-15 19:13:13
【问题描述】:

我正在寻找一种方法来对我的 C++ 结构进行某种反思(以帮助进行序列化以及一般的数据管理)。我找到了这个答案: C++ preprocessor: avoid code repetition of member variable list

这似乎是一个很好的解决方案,直到我实现它并且 Visual Studio 的 IntelliSense 爆发了。到处都是红色的曲线!它不理解使用 REFLECTABLE 宏的结构中的成员变量名称,即使编译器理解。

我是不是执行错了?我可以做些什么来让 IntelliSense 理解变量名吗?是否有更好的替代方法来获得与 IntelliSense 配合得很好的 C++ 反射?它必须能够遍历结构的成员并在运行时获取变量的名称。

【问题讨论】:

    标签: c++ boost reflection macros intellisense


    【解决方案1】:

    您可以选择三个选项。

    首先,您可以使用__INTELLISENSE__ 定义智能感知的替代方案:

    struct Person
    {
        Person(const char *name, int age)
            :
            name(name),
            age(age)
        {
        }
    private:
    #ifdef __INTELLISENSE__
        const char * name;
        int age; 
    #else
        REFLECTABLE
        (
            (const char *) name,
            (int) age
        )
    #endif
    };
    

    但是,如果你不想重复成员变量但又想摆脱红线,你可以禁用智能感知(解释为here),因为它似乎完全被破坏了。

    现在,如果您仍然希望获得良好的诊断和代码完成功能,那么您最好使用其他 IDE 或编辑器。由于大多数 IDE 或编辑器不会对此产生影响。对于 IDE,您可以尝试 KDevelop、CodeLite、Netbeans、Eclipse、QtCreator 等……对于编辑器,您可以尝试 emacs、vim、sublime 等……(理想情况下,与 clang 集成)。它们都提供比 Visual Studio 更好的诊断和代码完成功能。

    【讨论】:

    • 告诉某人切换 IDE 没有帮助。带有 VAX 的 Visual Studio 有很多很棒的功能,像 eclipse 和 NetBeans 所没有的。
    • 感谢 Paul,很高兴从源头获得答案。我在这里找到了您对此主题的另一个回复:stackoverflow.com/a/20296699/1917447我现在正在使用该 Boost Fusion 解决方案。除了使用 Fusion 在两个地方声明变量的额外工作之外,您的自定义宏与 Fusion 相比有什么优势吗?
    • @Jonathan 自定义宏的唯一真正优势是您可以扩展它以支持其他事物,例如方法或属性。但是,如果您只需要反思简单的领域,那么使用 Boost.Fusion 有很多优点,例如所有的算法(不仅仅是for_each),并且它与其他库如 Boost 很好地集成.Geometry 或 Boost.Spirit。
    猜你喜欢
    • 2020-03-09
    • 1970-01-01
    • 2013-03-27
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 2023-03-28
    相关资源
    最近更新 更多