首页 > 解决方案 > 如何将 optional 与托管类型一起使用

问题描述

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

这是一个小代码示例。

 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\可选 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++-cliclr

解决方案


我对 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。


推荐阅读