c++ - 类型特征与静态成员的优势?

标签 c++ typetraits

我有一个类 (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_MATERIALVOXEL_HAS_DENSITY 部分。两个简单的选项是:

  1. 将静态hasMaterial()hasDensity() 方法添加到Voxel 类,以在派生类中覆盖。
  2. 使用 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/

相关文章:

c++ - 为什么移动构造函数会影响 is_assignable?

c++ - 在编译时检测 typedef(模板元编程)

c++ - 是否可以根据分配对象的类型特征覆盖全局 new 运算符?

c++ - 如何使用静态断言和类型特征防止嵌套模板类型中的菱形模式?

c++ - 为什么 std::is_function 对简单函数和 lambda 返回 false?

c++ - 是否可以使用 type_traits 来区分 char 和 wchar_t?

c++ - 直接使用 C++ WinRT 组件或 C++ XAML 项目是否存在任何性能问题?

c++ - 多线程C++程序性能不佳

c++ - 窗口 HTTP IO 完成端口

c++ - 使用函数指针的 STL 映射