C++ 当涉及多个模板类型时,是否可以缩小类和函数之间的朋友关系?
假设我将图像类表示为:C++ 当涉及多个模板类型时,是否可以缩小类和函数之间的朋友关系?,c++,templates,friend,C++,Templates,Friend,假设我将图像类表示为: template <typename Pixel> class Image { ... }; 模板类图像{…}; 我需要我自己的交换功能来防止额外的图像复制,所以我需要让它成为图像的朋友。如果我写的是内部图像: template <typename T> friend void swap(Image<T>&, Image<T>&); 模板朋友无效交换(图像和,图像和); 我得到了我想要的,但它使所有的
template <typename Pixel> class Image { ... };
模板类图像{…};
我需要我自己的交换功能来防止额外的图像复制,所以我需要让它成为图像的朋友。如果我写的是内部图像:
template <typename T> friend void swap(Image<T>&, Image<T>&);
模板朋友无效交换(图像和,图像和);
我得到了我想要的,但它使所有的交换函数成为所有图像类的朋友。因此,我可以将朋友关系缩小如下:
template <typename Pixel> class Image;
template <typename T> void swap(Image<T>&, Image<T>&);
template <typename Pixel> class Image {
...
friend void swap<>(Image&, Image&);
};
模板类图像;
模板无效交换(图像和,图像和);
模板类图像{
...
朋友无效交换(图像和,图像和);
};
如中所述
现在假设我还有一个卷积函数,可以采用浮点或整数核:
template <typename Pixel, typename KernelValue>
Image<Pixel> convolve(const Image<Pixel>&, const Kernel<KernelValue>&);
模板
图像卷积(常数图像&常数核&);
卷积需要访问图像的原始内存,所以它也必须是一个朋友。但是,我想部分缩小友谊的范围,以便Convalve是所有内核值的朋友,但仅是特定像素类型的朋友,例如:
template <typename KernelValue> friend Image<Pixel>
convolve(const Image<Pixel>&, const Kernel<KernelValue>&);
模板好友图像
卷积(常数映像&常数核&);
在图像定义内部。编译器根本不喜欢这个(或其他变体),主要是因为它与原始函数声明不匹配,所以无法访问私有指针。有可能在这里得到我想要的吗,或者我应该满足于“更友好”的版本吗?据我所知,您不能拥有部分专用的模板函数
您可以创建一个卷积器结构,可以对其进行部分专门化,然后创建一个包装器来进行卷积。我看到这种情况的唯一方法是在Image类中定义函数,如下所示:
#include <iostream>
using std::cout;
template <typename Pixel>
struct image
{
template <typename KernelValue>
friend image<Pixel> convolve(image<Pixel> const&, image<KernelValue> const&)
{
cout << "foo\n";
return image<Pixel>();
}
};
int main()
{
image<int> i;
image<float> i2;
convolve(i, i2);
}
#包括
使用std::cout;
模板
结构映像
{
模板
友元映像卷积(映像常量&,映像常量&)
{
库特