代码之家  ›  专栏  ›  技术社区  ›  Sorin Antohi

C++中的元类与反射

  •  1
  • Sorin Antohi  · 技术社区  · 15 年前

    在我的空闲时间里,我遇到了一个小问题,要解决的是在C++中运行对象行为和运行时的类行为。我读了一点,发现这个链接对我很有用。 http://www.vollmann.ch/en/pubs/meta/meta/meta.html 沃尔曼先生制定了一个元对象协议(MOP),用于在运行时定义类,更确切地说是它们的属性。

    我在运行时尝试在相同的事情中添加方法,动态加载DLL,但对象不知道它们新添加的行为。我在XML文件中保存了有关dlls中方法的详细信息,当我想向类/对象添加新行为时,我分析了XML文件,只加载了我需要的dll,但这不够灵活。

    这只是一个研究案例,所以如果你有任何指导,请做。我在C++方面没有太多的经验,但我喜欢挑战。

    提前谢谢。

    3 回复  |  直到 15 年前
        1
  •  5
  •   Tobias Langner    15 年前

    您可以尝试为所有类创建某种基类。此类具有某种用于函数指针的Add方法。每个fp都分配了某种类型的句柄或字符串。稍后,您可以通过某种通用调用方法调用添加的函数。

    对于函数的参数,您需要某种方法将其传递给函数以引用类的数据。也许您会将数据封装在某种结构中,并向该结构传递一个引用/指针。对于其他参数,可以使用一些指针列表或查看bind。

    请注意,这是一个重大的任务,因为C++并不是用这些东西来创建的。

        2
  •  2
  •   Elemental    15 年前

    上面的Tobias L方法是我所看到的唯一可能的解决方案,在传递参数和将参数绑定到新方法时遇到了真正的困难(正如TL所说),在我看来,通过使用标准的Boost库功能,大多数非常技术的代码可能会有很大的帮助。具体来说,绑定和函数/函数类的东西似乎提供了很多您可能需要的东西,以使“方法”遵循volmann先生的“属性”框架。

        3
  •  1
  •   dicroce    15 年前

    无法通过动态库加载将方法添加到C++对象中。只是不太管用。

    通常,人们将整个对象存储在dll/so中…甚至这是一个痛苦的C++(由于名字的缩写)。您将一次又一次看到的习惯用法是在外部“c”块中声明的一个函数,该块(通过dlsym()或其他方法)返回一个工厂类,可用于创建一系列不同的对象。