是否有一种方法可以使这些密切相关的类型互操作
Is there a way to make these closely-related types interoperable?
我有一个模板类,用于处理存储在其他地方的数据作为二维图像。
template <typename Pixel>
class ImageWin {
...
};
它具有对底层图像进行读写访问的迭代器和只读访问的const_iterator,并且如您所料,const方法返回const迭代器,非const方法返回非const迭代器。如果Pixel
类型为const,则所有的迭代器都是const迭代器。
这使得ImageWin<const int>
和const ImageWin<int>
的类型非常相似。它们都有相同的迭代器集合(const迭代器)。两者都不能修改底层像素。唯一的区别是ImageWin<const int>
可以指向其他地方(即,窗口指向的地方是可变的,但像素不是)。
如果我有一个需要读访问像素数据的函数,我希望能够声明如下:
void needs_read_only( const ImageWin<int>& image );
问题是,是否有任何方法将ImageWin<const int>
传递到它?我当然可以使它成为一个模板函数,但我尽量避免这样做。我想我可以让const ImageWin<Pixel>
隐式地转换为ImageWin<const Pixel>
,但我实际上想要相反的,因为const ImageWin
比ImageWin
的const像素更具限制性。一般来说,我不能将ImageWin<Pixel>
转换为ImageWin<const Pixel>
,因为如果ImageWin<Pixel>
不是const,那么这会违反像素的const-ness。
有什么技巧我错过了吗?
谢谢。
为什么不直接重载它呢?
void needs_read_only( const ImageWin<Pixel>& image ) /* const ??? */;
void needs_read_only( const ImageWin<const Pixel>& image ) /* const ??? */;
请随意提出两个实现之间的逻辑。你可以向这些函数传递任何类型的引用。
作为旁注,如果它们是成员函数,请仔细检查this
指针是否应该是const。
相关文章:
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 编译为 wasm 的 C++ 和 Rust 程序可以以某种方式互操作吗?
- 有什么语言可以与C++互操作吗
- 子集相关位操作
- 使 Flutter C/C++ 互操作示例正常工作
- C++互操作(隐式 PInvoke)的限制
- COM 互操作结构定义与内存布局不匹配
- _Complex 和 std::complex 之间的 C/C++ 互操作
- C# COM 服务器互操作 - System.InvalidCastException.
- 从C++与 C 灵活阵列成员互操作的正确方法是什么?
- 如何通过 COM 互操作访问复杂对象的属性?
- 如何区分"QObject"的亲子关系关注点,例如与其他所有者进行互操作?
- DirectWrite GDI 互操作:使用"IDWriteFontFace"绘制文本的简单方法
- opencl openGL互操作内核参数用于读取 写入
- Rust 互操作与 C++ std::string
- 将互操作 HwndSource 包装在 c++/cli 中,以用于本机 c++/MFC 应用程序
- 跨 C# 和 COM 互操作使用对象C++
- 尝试为c++互操作自动生成库时出错
- 在MS Visual Studio 2010上使用带有Cuda互操作的OpenGL缓冲区时出现异常错误
- 是否有一种方法可以使这些密切相关的类型互操作