如何将可选的与托管类型一起使用
How to use optional with a managed type
我想创建一个可能存在异常的函数,如果是这种情况,return 是可选的。
这是一个小代码示例。
optional<Exception^> opt;
if (opt)
MessageBox::Show("Error");
我收到以下错误:
Error C3265 cannot declare a managed '_Value' in an unmanaged
'std::_Optional_destruct_base<_Ty,false>::$UnnamedClass[=11=]x61d94762$' CLR d:\visualstudio\vc\tools\msvc.16.27023\include\optional 87
Error C2848 'std::_Optional_destruct_base<_Ty,false>::_Value': a
managed type cannot be a member of a
union CLR d:\visualstudio\vc\tools\msvc.16.27023\include\optional 87
Error C3699 '&&': cannot use this indirection on type
'_Ty' CLR d:\visualstudio\vc\tools\msvc.16.27023\include\optional 431
Error C3699 '&&': cannot use this indirection on type 'const
_Ty' CLR d:\visualstudio\vc\tools\msvc.16.27023\include\optional 435
Error C3699 '&&': cannot use this indirection on type
'_Ty' CLR d:\visualstudio\vc\tools\msvc.16.27023\include\optional 467
Error C3699 '&&': cannot use this indirection on type 'const
_Ty' CLR d:\visualstudio\vc\tools\msvc.16.27023\include\optional 476
那么我该如何使用可选的呢?在 C++ CLI 中有可能吗?有哪些替代方案?
我对 std::optional 的理解是,它是一个 值类型 ,可能因为某些事情失败而不包含值。处理此类故障的 .Net 标准方法是抛出异常或让异常传播出去。但是,听起来您不想这样做,所以这里有替代方案。
对于 .Net 引用类型(在 C# 中声明为 class
,在 C++/CLI 中声明为 ref class
或 ref struct
,在 C++/CLI 中与 ^
), 处理这个的方法很简单return nullptr
。引用类型很少按值存储,returning null 更为标准。
对于 .Net 值类型(在 C# 中声明为 struct
,在 C++/CLI 中声明为 value class
或 value struct
,在 C++/CLI 中使用 without ^
),我会用 System::Nullable<T>
。 Nullable 是一种类似于 Optional 的类型,其中一个值类型允许为 null。
我想创建一个可能存在异常的函数,如果是这种情况,return 是可选的。
这是一个小代码示例。
optional<Exception^> opt;
if (opt)
MessageBox::Show("Error");
我收到以下错误:
Error C3265 cannot declare a managed '_Value' in an unmanaged 'std::_Optional_destruct_base<_Ty,false>::$UnnamedClass[=11=]x61d94762$' CLR d:\visualstudio\vc\tools\msvc.16.27023\include\optional 87
Error C2848 'std::_Optional_destruct_base<_Ty,false>::_Value': a managed type cannot be a member of a union CLR d:\visualstudio\vc\tools\msvc.16.27023\include\optional 87
Error C3699 '&&': cannot use this indirection on type '_Ty' CLR d:\visualstudio\vc\tools\msvc.16.27023\include\optional 431 Error C3699 '&&': cannot use this indirection on type 'const _Ty' CLR d:\visualstudio\vc\tools\msvc.16.27023\include\optional 435
Error C3699 '&&': cannot use this indirection on type '_Ty' CLR d:\visualstudio\vc\tools\msvc.16.27023\include\optional 467
Error C3699 '&&': cannot use this indirection on type 'const _Ty' CLR d:\visualstudio\vc\tools\msvc.16.27023\include\optional 476
那么我该如何使用可选的呢?在 C++ CLI 中有可能吗?有哪些替代方案?
我对 std::optional 的理解是,它是一个 值类型 ,可能因为某些事情失败而不包含值。处理此类故障的 .Net 标准方法是抛出异常或让异常传播出去。但是,听起来您不想这样做,所以这里有替代方案。
对于 .Net 引用类型(在 C# 中声明为 class
,在 C++/CLI 中声明为 ref class
或 ref struct
,在 C++/CLI 中与 ^
), 处理这个的方法很简单return nullptr
。引用类型很少按值存储,returning null 更为标准。
对于 .Net 值类型(在 C# 中声明为 struct
,在 C++/CLI 中声明为 value class
或 value struct
,在 C++/CLI 中使用 without ^
),我会用 System::Nullable<T>
。 Nullable 是一种类似于 Optional 的类型,其中一个值类型允许为 null。