gpt4 book ai didi

c++ - 当涉及多个模板类型时,是否可以缩小类和函数之间的友元关系?

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

假设我将图像类表示为:

template <typename Pixel> class Image { ... };

我需要自己的交换函数来防止图像的额外复制,所以我需要让它成为 Image 的友元。如果在图片里面我写:

template <typename T> friend void swap(Image<T>&, Image<T>&);

我得到了我想要的,但它使所有 Image 类的所有交换函数成为 friend 。所以我可以缩小 friend 关系如下:

template <typename Pixel> class Image;
template <typename T> void swap(Image<T>&, Image<T>&);

template <typename Pixel> class Image {
...
friend void swap<>(Image&, Image&);
};

C++ FAQ-lite 35.16 中所述.

现在假设我还有一个可以采用 float 或整数核的卷积函数:

template <typename Pixel, typename KernelValue>
Image<Pixel> convolve(const Image<Pixel>&, const Kernel<KernelValue>&);

卷积需要访问图像的原始内存,因此它也必须是 friend 。但是,我想部分缩小友元,以便卷积是所有 KernelValues 的 friend ,但仅限于特定的像素类型,例如:

template <typename KernelValue> friend Image<Pixel> 
convolve(const Image<Pixel>&, const Kernel<KernelValue>&);

在图像定义中。编译器根本不喜欢这个(或其他变体),主要是因为它与原始函数声明不匹配,因此无法访问私有(private)指针。是否可以在这里得到我想要的,还是我应该满足于“更友好”的版本?

最佳答案

据我所知,您不能拥有部分专用的模板化函数。

您可以制作一个可以部分特化的卷积器结构,然后创建一个包装器来执行卷积。

关于c++ - 当涉及多个模板类型时,是否可以缩小类和函数之间的友元关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/830573/

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