不要被标题吓到!

这篇文章是受此博客文章启发的。 在帖子中,Stefan提到他将完整的实现作为“读者的锻炼”。 在学习了有关模板元编程的一段时间之后,我想出了一个我想在这篇文章中分享的实现。 是的,您可以使用boost,但是这样做的乐趣在哪里?
最终,我们最终在此处创建的util方法将用于我的游戏引擎实现,因此,如果您还没有看到真正的用例,请稍候;)。
- Scalarr在Gamescom 2018上:游戏的未来和其他见解
- “我为什么玩电子游戏?” – cictwvsu-online –中
- 我曾经以逆向工程为生,这就是为什么在发行之前应该对游戏进行混淆。
- 设计自己的游戏的梦想? 独立基金可能
- 一些最终的游戏机制
问题
我们要执行一个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,然后您就会明白。