我想创建一个可能存在异常的函数,然后返回可选值。
这里有一些代码示例。
optional<Exception^> opt;
if (opt)
MessageBox::Show("Error");
我收到以下错误:
错误C3265无法在非托管状态中声明托管'_Value' 'std :: _ Optional_destruct_base <_Ty,false> :: $ UnnamedClass $ 0x61d94762 $ 23 $'CLR d:\ visualstudio \ vc \ tools \ msvc \ 14.16.27023 \ include \ optional 87
错误C2848'std :: _ Optional_destruct_base <_Ty,false> :: _ Value':a 托管类型不能是的成员 联合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中完全可能吗?有哪些替代方案?
答案 0 :(得分:0)
我对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。