我想创建一个可能存在异常的函数,如果是这种情况则返回可选项。
这是一个小代码示例。
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 \ optional 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。