如何使用托管类型的可选项

问题描述 投票:1回答:1

我想创建一个可能存在异常的函数,如果是这种情况则返回可选项。

这是一个小代码示例。

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

c++-cli clr
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.