【问题标题】:How to use optional with a managed type如何将 optional 与托管类型一起使用
【发布时间】:2019-08-29 21:49:30
【问题描述】:

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

这是一个小代码示例。

 optional<Exception^> opt;
        if (opt)
            MessageBox::Show("Error");

我收到以下错误:

错误 C3265 无法在非托管中声明托管“_Value” 'std::_Optional_destruct_base<_ty>::$UnnamedClass$0x61d94762$23$' CLR d:\visualstudio\vc\tools\msvc\14.16.27023\include\optional 87

错误 C2848 'std::_Optional_destruct_base<_ty>::_Value': a 托管类型不能是 union 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,请考虑标记 c++-cli

标签: c++-cli clr


【解决方案1】:

我对 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&lt;T&gt;。 Nullable 是一种类似于 Optional 的类型,其中值类型允许为 null。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 2017-05-07
    • 1970-01-01
    • 2010-10-18
    • 2019-07-14
    • 2018-04-26
    相关资源
    最近更新 更多