使用运行时类型开关(和模板化函数)避免代码重复

捷豹路虎

我有一些点云和一些空间索引类,如QuadTreeOctreePartion尽在点云的快速查询。根据点云结构,可能适合使用给定的空间索引类型或其他类型。

所有空间索引类具有相同的公共成员:一个构造函数,insertlookupknn显然,实现方式不同,私有成员也不同。

class SpatialIndexType {
  public:
    SpatialIndexType(const std::vector<Point>&);
    bool insert(const Point&);
    template<typename T> void lookup(T& shape, std::vector<Point>&);
    void knn(const Point&, const unsigned int, std::vector<Point>&);
}

我通常以这种方式使用我的课程(伪代码)

// Build a spatial index
SpatialIndexType index(point_cloud);

// Make successive queries of points in a shape
// (here a disc)
for(i = 0 ; i < n ; i++) {
  Disc disc(x[i], y[i], radius);
  std::vector<Point> pts;
  index.lookup(disc, pts);

  // Do something with pts which might be many lines of code
}

现在,假设我知道我的结构point_cloud要求在运行时使用Octree而不是Quadtree 我可以创建一个开关功能(伪代码)

do_something(point_cloud, type) {
  switch(type) {
    case 1: do_something_with_quadtree(point_cloud)
    case 2: do_something_with_octree(point_cloud)
    case 3: do_something_with_partition(point_cloud)
  }
}

和我所有的do_something_with_*功能将是严格相同的。他们将通过一个字不同:SpatialIndexType既可为QuadTreeOctreePartition或潜在的东西。

我很确定这是避免这种愚蠢的代码重复的聪明方法。我试图从虚拟类继承,SpatialIndex但是我陷入了lookup无法定义的模板化成员的困境virtual

贾罗德42

您可以模板化功能

template <typename SpatialIndexType>
void do_something(const std::vector<Point>& point_cloud)
{
    // Build a spatial index
    SpatialIndexType index(point_cloud);

    // Make successive queries of points in a shape
    // (here a disc)
    for (int i = 0 ; i < n ; i++) {
      Disc disc(x[i], y[i], radius);
      std::vector<Point> pts;
      index.lookup(disc, pts);

      // Do something with pts which might be many lines of code
    }
}

和您的运行时调度程序:

void do_something(const std::vector<Point>& point_cloud, int type) {
    switch(type) {
        case 1: do_something_with<Quadtree>(point_cloud);
        case 2: do_something_with<Octree>(point_cloud);
        case 3: do_something_with<Partition>(point_cloud);
    }
}

如果必须分派几次,则可以使用std::variant分派因素:

template <typename> struct Tag{};

using SpatialIndexTypeVariant = std::variant<Tag<QuadTree>, Tag<Octree>, Tag<PArtition>>;

SpatialIndexTypeVariant RuntimeType(int type)
{
    switch (type) {
        case 1: return Tag<Quadtree>();
        case 2: return Tag<Octree>();
        case 3: return Tag<Partition>();
    }
    throw std::runtime_error("Unknown type");
}

然后(C ++ 20):

std::visit([&]<typename T>(Tag<T>){ do_something_with<T>(point_cloud); }, RuntimeType(type));

对于C ++ 17,您可以将通用函数的签名更改为:

template <typename SpatialIndexType>
void do_something(Tag<SpatialIndexType>, const std::vector<Point>& point_cloud);

并使用常规的通用lambda。

std::visit([&](auto tag){ do_something_with(tag, point_cloud); }, RuntimeType(type));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用运行时类型信息和仅返回Shape的函数实例化Lazy <Square>?

来自分类Dev

缺少类型多数民众赞成的模板函数(在运行时未使用)

来自分类Dev

在运行时使用默认构造函数实例化类型参数化的类

来自分类Dev

运行时模板实例化和功能选择

来自分类Dev

将任务移动到单独的线程,避免任务运行时的重复和正确使用 Executors + Future

来自分类Dev

在运行时选择模板参数时如何避免代码的指数增长

来自分类Dev

模板类型的C ++运行时决策

来自分类Dev

可以静态分析Julia(julia-lang)代码以避免运行时类型错误吗?

来自分类Dev

如何避免在此代码中进行运行时类型检查?

来自分类Dev

C ++模板和运行时

来自分类Dev

如何避免模板函数返回类型重复?

来自分类Dev

从嵌套字典中删除元组键;避免运行时和类型错误

来自分类Dev

在运行时根据不同类型实例化模板类

来自分类Dev

在运行时修改模板化函数的名称-可能吗?

来自分类Dev

使用有类型的F#代码引用和无类型的F#代码引用对运行时性能有何影响?

来自分类Dev

使用.AsFactory()的运行时类型确定

来自分类Dev

使用运行时生成的类型

来自分类Dev

避免模板函数中用于区分const和非const的代码重复

来自分类Dev

避免用于区分const和非const的模板函数中的代码重复

来自分类Dev

递归模板产生运行时代码?

来自分类Dev

VBA代码的重复记录运行时错误

来自分类Dev

VBA代码的重复记录运行时错误

来自分类Dev

在运行时识别模板类型名

来自分类Dev

在运行时识别模板类型名

来自分类Dev

根据运行时提供的类型执行模板功能

来自分类Dev

使用CLRS代码和Robert Sedgewick代码的插入排序运行时间的差异

来自分类Dev

使用运行时DLL(/ MD)避免DLL与运行时相关

来自分类Dev

如何在运行时首先使用EF代码从ObjectContext获取实体类型的列表?

来自分类Dev

Boost.Fusion运行时开关

Related 相关文章

  1. 1

    如何使用运行时类型信息和仅返回Shape的函数实例化Lazy <Square>?

  2. 2

    缺少类型多数民众赞成的模板函数(在运行时未使用)

  3. 3

    在运行时使用默认构造函数实例化类型参数化的类

  4. 4

    运行时模板实例化和功能选择

  5. 5

    将任务移动到单独的线程,避免任务运行时的重复和正确使用 Executors + Future

  6. 6

    在运行时选择模板参数时如何避免代码的指数增长

  7. 7

    模板类型的C ++运行时决策

  8. 8

    可以静态分析Julia(julia-lang)代码以避免运行时类型错误吗?

  9. 9

    如何避免在此代码中进行运行时类型检查?

  10. 10

    C ++模板和运行时

  11. 11

    如何避免模板函数返回类型重复?

  12. 12

    从嵌套字典中删除元组键;避免运行时和类型错误

  13. 13

    在运行时根据不同类型实例化模板类

  14. 14

    在运行时修改模板化函数的名称-可能吗?

  15. 15

    使用有类型的F#代码引用和无类型的F#代码引用对运行时性能有何影响?

  16. 16

    使用.AsFactory()的运行时类型确定

  17. 17

    使用运行时生成的类型

  18. 18

    避免模板函数中用于区分const和非const的代码重复

  19. 19

    避免用于区分const和非const的模板函数中的代码重复

  20. 20

    递归模板产生运行时代码?

  21. 21

    VBA代码的重复记录运行时错误

  22. 22

    VBA代码的重复记录运行时错误

  23. 23

    在运行时识别模板类型名

  24. 24

    在运行时识别模板类型名

  25. 25

    根据运行时提供的类型执行模板功能

  26. 26

    使用CLRS代码和Robert Sedgewick代码的插入排序运行时间的差异

  27. 27

    使用运行时DLL(/ MD)避免DLL与运行时相关

  28. 28

    如何在运行时首先使用EF代码从ObjectContext获取实体类型的列表?

  29. 29

    Boost.Fusion运行时开关

热门标签

归档