如何在托管类型中使用可选

时间:2019-04-08 17:21:17

标签: c++-cli clr

我想创建一个可能存在异常的函数,然后返回可选值。

这里有一些代码示例。

 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中完全可能吗?有哪些替代方案?

1 个答案:

答案 0 :(得分:0)

我对std :: optional的理解是,它是一个值类型,它可能由于某些失败而可能不包含值。 .Net处理此类故障的标准方法是引发异常或让异常传播出去。但是,听起来您好像不想这样做,所以这里有替代方法。

对于.Net引用类型(在C#中声明为class,在C ++ / CLI中声明为ref classref struct,在C ++ / CLI中与^一起使用) ,处理此问题的方法只是返回nullptr。引用类型很少,很少按值存储,并且返回null更为标准。

对于.Net值类型(在C#中声明为struct,在C ++ / CLI中声明为value classvalue struct,在C ++ / CLI中使用 ^),我会使用System::Nullable<T>。 Nullable是类似于Optional的类型,其中值类型允许为null。