模板元编程:在类方法上编译时间循环

不要被标题吓到!

这篇文章是受此博客文章启发的。 在帖子中,Stefan提到他将完整的实现作为“读者的锻炼”。 在学习了有关模板元编程的一段时间之后,我想出了一个我想在这篇文章中分享的实现。 是的,您可以使用boost,但是这样做的乐趣在哪里?

最终,我们最终在此处创建的util方法将用于我的游戏引擎实现,因此,如果您还没有看到真正的用例,请稍候;)。

问题

我们要执行一个for循环,该循环调用依赖于迭代器value参数的类方法。 这是一个非常简单的问题,这是解决方案:

我们经营一家清洁公司,每天必须清洗一堆房屋,但要使用不同的工具。 这是我们的HouseCleaner类:

要解决此问题,我们将需要添加一层抽象。 而不是将CleanHouse结构传递给forLoop,我们将传递另一个结构CleanHouseWrapper,该结构随后将为我们调用cleanHouse()方法。

让我们用完这里的内容:

forLoop

会递归循环并在Wrapper上调用operator()的Util方法。
N 运行循环多少次(N = 4表示4次运行,N = 1,2,3,4)。
包装器 这是一个应实现operator()的结构,我们将把所有给定参数转发给该结构。
Args 传递给Wrapper.operator()的参数列表。

洁净室包装

允许我们调用成员方法(cleanHouse)的包装器。
N 这是循环的当前迭代,需要传递给成员方法。
parent 这是指向父类型实例的指针,我们将调用该方法的成员方法。
工具传递给cleanHouse()

收拾屋子

打扫房子。 通过这种方法,我们可以使用N,但也可以访问HouseCleaner实例的任何私有值。
N:要清理的房子(模板参数-在编译时可用)
工具用于打扫房屋的工具(实际参数-在运行时可用)

我们已经做到了! 让我们尝试运行我们的代码:

  HouseCleaner *清洁=新的HouseCleaner(); 
清洁器-> cleanAllHouses(“扫帚”);

输出:
用扫帚打扫4号房
用扫帚打扫房子#3
用扫帚打扫房子#2
用扫帚打扫房子#1

我骗你了

如果您一直尝试按照上面的代码进行编译,则可能会出现关于函数模板的部分专业化的错误。 在C ++中,函数不能部分专门化,而类可以。 因此,我们将函数包装在部分专门的类中,并称之为一天:

我们最终的编译器就绪的HouseCleaner代码如下所示:

卡巴姆! 您现在是模板元编程专家。 如果您认为房子清洁示例有点人为设计,而又不知道为什么要这样做,请等一下Nomad,然后您就会明白。