如何将可选的与托管类型一起使用

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 classref struct,在 C++/CLI 中与 ^), 处理这个的方法很简单return nullptr。引用类型很少按值存储,returning null 更为标准。

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