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

时间:2014-10-07 17:41:04

标签: c++ module include preprocessor-directive

我想根据定义加载各种头文件(模块,插件)。继承人我的做法:

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”未定义

2 个答案:

答案 0 :(得分:0)

类似于包含警卫,应该使用#ifndef代替#ifdef

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

<击>

这里的事情是编译器将#include“a.h”替换为a.h文件的内容。没有它包含的内容。如果当前上下文中的语法是正确的,那么它应该都是好的。

我已经尝试过您的代码,一切正常。所以请提供有关错误的详细信息。

答案 1 :(得分:0)

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

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