gpt4 book ai didi

c++ - 具有显式类型名称的函数模板

转载 作者:搜寻专家 更新时间:2023-10-31 01:49:39 24 4
gpt4 key购买 nike

我一直在阅读一些关于模板的页面。

我看到,模板是这样使用的:

template <typename T>
T func(T a) {...}

所以它是为了提供对不同类型的变量使用相同代码的灵 active 。而且,我们可以使用似乎只适用于类的特化,就像:

template <> class A<int> {....}

但是我没有找到像这样的用法:

template<int N, bool isVertical, bool isFirst, bool isLast>
static void filter(int bitDepth, Pel const *src, int srcStride,
short *dst, int dstStride, int width,
int height, short const *coeff);

它的名字是这样的:

filter<N, false, true, true>(bitDepth, src, srcStride, dst, dstStride, width, height, coeff);

在这段代码中,模板被赋予了实型和绝对类型,恕我直言,我们可以在过滤器的参数列表中添加另外四个参数而不是使用模板。

那么,为什么要这样使用模板呢?

最佳答案

template s 不是函数。 template s 是函数工厂,其中参数决定生成哪个函数。

(template 函数也有基于参数的类型推导,但这只是决定哪个函数是由 template 函数工厂生成的)。

所以这样:

template<int N, bool isVertical, bool isFirst, bool isLast>
static void filter(int bitDepth, Pel const *src, int srcStride,
short *dst, int dstStride, int width,
int height, short const *coeff);

没有定义一个 filter功能,而是一整套此类功能。

<> 中的参数在 filter 之后是传递给 template 的参数函数工厂来确定实际生成哪个函数。

当这些函数由工厂生产时(在编译时),传递给 template 的值功能工厂是众所周知的。因此,围绕这些常量进行优化非常容易。

的确,内联和 as-if 规则可以让编译器接受文字参数,推断给定参数是编译时常量,并编译包含该常量的函数——但这种技术既脆弱又有限。

template工厂生产的功能,它是一个实际的功能。因此,您可以存储指向它的指针并将其作为无状态函数传递。

举个具体的例子,假设你要处理一张图片。现在处理图像的实用方法是使用一些数据设置一个基于扫描线的函数,然后遍历图像的扫描线,将每个扫描线传递给基于扫描线的函数。

另一方面,许 multimap 像变换都是逐像素变换。在每个图像转换函数中对这些像素编写所有优化循环会导致大量复制粘贴代码。但是您不能将指向基于像素的操作的指针传递给扫描线处理函数——与典型的每像素操作相比,取消引用指针的开销要高一点。

因此,您创建一个 template函数工厂在编译时采用每个像素的函数,并将其包装在像素代码的迭代中。开销就这样消失了。

此外,您可以传入另一个 template 而不是像素操作函数工厂(通过 template class ),所以如果你正在做 SSE ,你可以做类似 set 的事情type assembly, per-pixel 操作应该一次处理多少个像素等等。

结果可能是一堆用if写的代码s,看似充满了分支和条件,但当您将所有参数作为模板参数传入时,实际上编译成几乎完全平坦且无分支的扫描线操作。

简而言之,template它有助于解决传统上通过代码生成解决的问题——无论是宏还是第三方工具。它们非常强大和方便,以至于人们在以前从未费心的情况下使用它们进行代码生成,例如为每种用户类型生成自定义容器、自定义搜索算法、哈希算法、迭代、for 循环和无数其他傻事。

一切 template没有它们也能做到,但这并不奇怪:当心图灵 tar 坑,那里一切都是等价的,但没有什么重要的事情是容易的。 template让某种代码生成容易

关于c++ - 具有显式类型名称的函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16258910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com