C++函数,它接受包含子类型的参数化类型

C++ function that accepts parametrized type including subtypes

本文关键字:类型 参数化类型 包含 函数 C++      更新时间:2023-10-16

OpenFOAM库定义了两种类型,volMeshsurfaceMesh,这两种类型都继承自GeoMesh<fvMesh>。我想定义一个接受参数的函数:

void foo(GeometricField<vector, fvsPatchField, GeoMesh<fvMesh> >& field) { ... }

然而,当我尝试调用函数时,g++给出了错误"引用类型的无效初始化":

// surfaceVectorField is a typedef GeometricField<vector, fvsPatchField, surfaceMesh>
surfaceVectorField Uf( /* initialisation arguments */ ); 
foo(Uf);

来自Java背景,这个问题似乎类似于忘记使用之类的声明

void foo(GeometricField<vector, fvsPatchField, ? extends GeoMesh<fvMesh>> field) { ... }

如果可能的话,我需要避免使用C++11的特定功能。

函数声明中的基本问题是无法解决参数的类型。这意味着,如果将基类作为模板参数,则无法推导出模板类的具体化。

您希望接受的参数是模板类GeometricField的一个实例。此外,类模板的名称不是类型。指示函数定义foo(GeometricField& field);是不可能的。

如果你想让函数同时接受曲面和体积网格类型的几何域,你需要将其作为模板函数或重载它。第一个模板:

template <typename T>
void foo(GeometricField<vector, fvsPatchField, T>& field) {}

或者只是

template <typename T>
void foo(T& field) {}

更适合您在函数中所做的操作。还要注意,如果要重用函数,则需要注意参数与预期不符的情况。

过载:

void foo(surfaceVectorField& field);
void foo(volVectorField& field);

这两种解决方案都会让你达到目标。