我有一个类 (Voxel
),它的子类可能有也可能没有许多不同的属性( Material 、密度等)以及 get 和 set 方法。现在,我想写一些代码如下:
template <typename VoxelType>
void process(VoxelType voxel)
{
if(VOXEL_HAS_MATERIAL)
{
//Do some work which involves calling get/setMaterial()
}
if(VOXEL_HAS_DENSITY)
{
//Do some work which involves calling get/setDensity()
}
}
因此,我想实现 VOXEL_HAS_MATERIAL
和 VOXEL_HAS_DENSITY
部分。两个简单的选项是:
- 将静态
hasMaterial()
和hasDensity()
方法添加到Voxel
类,以在派生类中覆盖。 - 使用
hasMaterial()
和hasDensity()
创建一个类型特征类,并将其专门用于每个Voxel
子类。
使用方法 (2) 允许为基本类型(int 等)定义特征,但这对我的情况没有用。在这里使用类型特征是否还有其他优势,或者我应该采用更简单的静态方法方法?
注意:我也知道基于 SFINAE 的方法,我将单独考虑这些方法。
Edit1:我已经更改示例代码以显示模板的使用。我正在寻找这个问题的静态而不是运行时解决方案。理想情况下,如果编译器确定不能为给定类型执行 if 语句,则它能够去除 if 语句中的代码。
最佳答案
为什么这些方法应该是静态的?只需在 Voxel 类中将方法声明为 virtual bool hasMaterial();
和 virtual bool hasDensity();
并在任何子类中覆盖它们。如果子类有则在子类中返回 true,否则返回 false。
然后你可以这样做:
void process(Voxel* voxel)
{
if(voxel->hasMaterial())
{
//Do some work which involves calling get/setMaterial()
}
if(voxel->hasDensity())
{
//Do some work which involves calling get/setDensity()
}
}
然后,您可以使用 Material 和密度的 getter 和 setter 创建一个类似于类的接口(interface),并让它们继承它。
关于c++ - 类型特征与静态成员的优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8601798/