C++函数,它接受包含子类型的参数化类型
C++ function that accepts parametrized type including subtypes
OpenFOAM库定义了两种类型,volMesh
和surfaceMesh
,这两种类型都继承自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);
这两种解决方案都会让你达到目标。
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 具有可变参数非类型参数的模板专用化
- 使用模板参数化映射旧版 C 接口的接口中的类型
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- 静态私有函数,模板化类型作为C++中的默认参数
- 参数化类的别名(或类型定义)内部类
- 无法使用类型为"结构节点 *"的左值初始化类型为"结构节点 *"的参数
- 如何使用变量参数化类型?C++
- 如何根据参数化类型的特定成员的类型对模板类函数进行不同的实现
- 使用 googletest 在类型参数化测试中标识使用的基类
- 确定参数的数字和类型,以及返回函数类型参数的类型
- 外部模板,用于使用非竞争类型参数化的模板
- 具有相同类型参数的类型安全变差函数
- C++函数,它接受包含子类型的参数化类型
- 如何在模板中表达字符串文本,该模板由用于表示文本的字符类型参数化
- 在c++中初始化参数化类型数组
- 参数化类型定义是可能的
- 在数组中的函数上使用宏使gtest类型参数化测试更简洁
- gtest类型参数化的多态性