c ++隐藏的唯一指针

时间:2015-09-08 07:32:11

标签: c++11 reference macros unique-ptr openfoam

我有一些代码依赖于一些包含文件,这些文件部分定义在源文件的开头(通常)和其他在函数中使用的文件。

我的典型示例是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()必须确保正确初始化对象,否则程序将崩溃。

我仍然保持问题开放,因为我对该解决方案不满意。

0 个答案:

没有答案