c++-cli - 如何将 optional 与托管类型一起使用
问题描述
我想创建一个可能存在异常的函数,如果是这种情况,则返回可选的。
这是一个小代码示例。
optional<Exception^> opt;
if (opt)
MessageBox::Show("Error");
我收到以下错误:
错误 C3265 无法在非托管 'std::_Optional_destruct_base<_Ty,false>::$UnnamedClass$0x61d94762$23$' CLR d:\visualstudio\vc\tools\msvc\14.16.27023\include\optional 中声明托管 '_Value' 87
错误 C2848 'std::_Optional_destruct_base<_Ty,false>::_Value':托管类型不能是联合 CLR d:\visualstudio\vc\tools\msvc\14.16.27023\include\optional 的成员 87
错误 C3699“&&”:无法在类型“_Ty”上使用此间接 CLR d:\visualstudio\vc\tools\msvc\14.16.27023\include\optional 431 错误 C3699“&&”:无法在类型“const _Ty”上使用此间接' CLR d:\visualstudio\vc\tools\msvc\14.16.27023\include\可选 435
错误 C3699 '&&':不能在类型 '_Ty' CLR d:\visualstudio\vc\tools\msvc\14.16.27023\include\optional 上使用此间接 467
错误 C3699 '&&':无法在类型 'const _Ty' CLR d:\visualstudio\vc\tools\msvc\14.16.27023\include\optional 上使用此间接 476
那么如何使用可选的呢?在 C++ CLI 中是否有可能?有哪些替代方案?
解决方案
我对 std::optional 的理解是它是一个值类型,它可能不包含值,因为某些事情失败了。.Net 处理此类故障的标准方法是抛出异常或让异常传播出去。但是,听起来您不想这样做,所以这里有替代方案。
对于 .Net 引用类型(在 C# 中声明为class
,在 C++/CLI 中声明为ref class
或ref struct
,在 C++/CLI 中^
与nullptr
. 引用类型很少按值存储,返回 null 更为标准。
对于 .Net 值类型(在 C# 中声明为struct
,在 C++/CLI 中声明为value class
或value struct
,在没有的C++/CLI 中^
使用),我会使用System::Nullable<T>
. Nullable 是一种类似于 Optional 的类型,其中值类型允许为 null。
推荐阅读
- android - MaterialApp 小部件的标题属性不起作用
- google-maps - 当我将 Googleplayservices v71 与 Xamarin Forms Maps v4.3 一起使用时出现异常
- sql - 计算表中最常见的
- java - 如何修复凯撒密码程序中的“char 无法转换为 java.lang.String”
- sql - oracle通过添加regexp_like将字符串连接到数字不起作用
- csv - 将 CSV 加载到 Odoo
- c# - 如何使用 Unity 的 PlayerPrefs 跳过关卡?
- ruby - 无法安装 `yt-core` gem
- google-earth-engine - 如何在 Google 地球引擎中对 Landsat 8 表面反射率数据进行云遮蔽?
- javascript - 如何使用 Ajax 显示 API 数据?