我有一些代码依赖于一些包含文件,这些包含文件部分定义在源文件的开头(通常)和其他在函数中使用的文件。
我的典型例子是 OpenFOAM 求解器源。
因为此代码的方案是高度程序化的,但我想将所有这些放入一个提供 init()、run() 和可能 release() 的类中,我计划将一些变量作为私有变量放入类中成员。
我不想修改包含的文件,因为它们属于库。
使用类的原因是其他例程类与此代码一起运行。
事情就是这样。init() 必须准备一些变量,并且这些变量(作为其他类的类型)不是显式构造函数和特殊参数的情况。它被调用一次。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
它工作得很好,但我一般不喜欢宏,特别是如果你需要调试代码。
现在我的问题是:有没有更好的方法来解决这个问题并使用模板定义之类的东西来实现所有的魔力?
编辑:我的意思是“工作得很好”,编译器可以翻译它。参考虽然仍然无效。
编辑:好的,我使用两个宏解决了无效指针问题:
#define FOAMPTR(TYPE,NAME) std::unique_ptr<TYPE> mp_##NAME
#define FETCHFOAMREF(NAME) auto &NAME=*mp_##NAME
现在我把FOAMPTR(TYPE,NAME)
它给会员,我得到了我独特的ptr。在该run()
方法中使用了第二个宏FETCHFOAMREF(NAME)
。当然 init() 必须确保正确初始化对象,否则程序将崩溃。
我仍然保留这个问题,因为我对该解决方案不满意。