我有一些代码依赖于一些包含文件,这些文件部分定义在源文件的开头(通常)和其他在函数中使用的文件。
我的典型示例是OpenFOAM求解器源。
因为这段代码的方案是高度程序化的,但是我想把所有这些都放到一个提供init(),run()和release()的类中,我打算把一些变量放到类中私人让他们成员。
我不想修改包含的文件,因为它们属于库。
使用类的原因是其他例程类与此代码一起运行。
这是事情。 init()必须准备一些变量,并且在这种情况下,这些变量(是其他clases的类型)不是显式构造函数和特殊参数。它被称为一次。 run()被多次调用。过程代码只有一个循环,并且该循环的内容被放入run()方法。
所以最好的解决方案是将这些变量放入std :: unique_ptr中,init可以构造它需要的任何东西。很明显,随着这个技巧,变量签名发生了变化,所以我创建了第二个引用声明:
std::unique_ptr<volScalarField> mp_p;
volScalarField &p = *mp_p;
现在这有点乏味,所以我创建了一个宏
FOAMPTR(volVectorField, p)
为我完成所有工作:
#define FOAMPTR(TYPE,NAME) std::unique_ptr<TYPE> mp_##NAME; TYPE &NAME=*mp_##NAME
它工作得很好,但我一般不喜欢宏,特别是如果你需要调试代码。
现在我的问题是:有没有更好的方法来解决这个问题,并使用其他类似模板定义的东西来完成所有的魔术?
修改:&#39;效果非常好&#39;我的意思是,编译器可以翻译它。但该参考仍无效。
编辑:好的,我使用两个宏解决了无效指针问题:
#define FOAMPTR(TYPE,NAME) std::unique_ptr<TYPE> mp_##NAME
#define FETCHFOAMREF(NAME) auto &NAME=*mp_##NAME
现在我把FOAMPTR(TYPE,NAME)
放到会员身上,我得到了我独特的ptrs。在run()
方法中,使用了第二个宏FETCHFOAMREF(NAME)
。当然init()必须确保正确初始化对象,否则程序将崩溃。
我仍然保持问题开放,因为我对该解决方案不满意。