如何实现动态模块(在头文件中)加载c++

How to implement dynamic module (in header files) loading c++

本文关键字:文件 加载 c++ 动态 何实现 实现 模块      更新时间:2023-10-16

我想根据定义加载各种头文件(模块、插件)。这是我的方法:

template<typename T = float>
class container {
   T *_data;
 #ifdef mymodule1
 #include mymodule1
 #endif
...}

Mymodule1.h:

container<T> fooOnContainer() [maybe const] {
   makesomething involving the T template parameter
}

在包含"main"的文件中:

#define mymodule1 "mymodule1.h"
#include "container.h"
in main { using it }

因此,基本上只有定义好的头文件才会包含在我的容器中。我在名为"cimg"的库中看到过这种方法,但我无法使其发挥作用,因为编译器无法推导模板参数。如果我做这样的东西也没关系:

container<T>& fooOnContainer(T param) {
...
}

但是,有没有一种方法可以像第一个"mymodule1.h"中那样做到这一点?可能是操作员过载?或者,如果不可能的话,有人能给我一个更好、简单的方法吗?(我真的不明白它是如何为那个图书馆工作的:)

编辑:

对不起,如果我是不确定的,所以这里有一些代码:

这是一个毫无意义的例子,但我想做这样的东西,但当然更复杂:

Mymodule1.h:

int getWidth() const {
    return (*this)._width;
}

intellisense说:"在非成员函数上不允许使用类型限定符"

另一个例子:

T getPos(int x) const {
    T* px;
    return _data[x];
}

intellisense说:"T"未定义,标识符"_data"未定义

哦,所以你只从intellisense得到错误?不是来自实际的编译器?这是因为在编辑Mymodule1.h文件时,编辑器没有所有数据,编辑器不知道代码实际上是一个更大类的一部分。

解决方案?如果你想继续使用这样的头文件,那就没有了。唯一的解决方案是不使用头文件,而是围绕实际代码使用预处理器条件。

它类似于include-guard,应该使用#ifndef而不是#ifdef

...
#ifndef mymodule1
#include mymodule1
#endif
...

这里的问题是编译器将#include"a.h"替换为.h文件的内容。不管它包含什么。若当前上下文中的语法是正确的,那个么它应该是好的。

我试过你的代码,一切都很好。因此,请提供有关错误的详细信息。