如何实现加载c ++的动态模块(在头文件中)
Posted
技术标签:
【中文标题】如何实现加载c ++的动态模块(在头文件中)【英文标题】:How to implement dynamic module (in header files) loading c++ 【发布时间】:2014-10-07 17:41:03 【问题描述】:我想根据定义加载各种头文件(模块、插件)。这是我的方法:
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;
智能感知说: " 非成员函数上不允许使用类型限定符 "
另一个例子:
T getPos(int x) const
T* px;
return _data[x];
智能感知说: “T”未定义,标识符“_data”未定义
【问题讨论】:
你好吗using it
实际上?
您能创建一个Minimal, Complete, and Verifiable example 并展示给我们看吗?还请包括您遇到的所有错误。
例如:容器 img; ...加载图像...容器 dest; dest = image.fooOnContainer([阈值什么的])
【参考方案1】:
哦,所以你只是从智能感知中得到错误?不是来自实际的编译器?那是因为当你编辑 Mymodule1.h
文件时,编辑器没有所有数据,编辑器不知道代码实际上是更大类的一部分。
解决方案?真的没有,如果你想继续使用这样的头文件。唯一的解决方案是不使用头文件,而是在实际代码周围使用预处理器条件。
【讨论】:
嗯,它似乎只是智能感知,我是个白痴:)(我之前编译错误,但之后我信任智能感知并没有编译它......)我想我会尝试使用预处理器条件来消除我的 .h 文件中的那些错误或类似的东西,谢谢!【参考方案2】:类似于包含守卫,应该使用#ifndef
而不是#ifdef
...
#ifndef mymodule1
#include mymodule1
#endif
...
这里的问题是编译器将#include "a.h" 替换为 a.h 文件的内容。不管它包含什么。如果当前上下文中的语法是正确的,那么一切都很好。
我已经尝试了您的代码,一切正常。所以请提供有关错误的详细信息。
【讨论】:
我认为 OP 实际上只希望在定义宏 的情况下包含该文件,而不是相反。以上是关于如何实现加载c ++的动态模块(在头文件中)的主要内容,如果未能解决你的问题,请参考以下文章