Как использовать опционально с управляемым типом - PullRequest
1 голос
/ 08 апреля 2019

Я хочу создать функцию, в которой может быть исключение, и возвращать необязательный, если это так.

Вот небольшой пример кода.

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

Я получаю следующие ошибки:

Ошибка C3265 не может объявить управляемое '_Value' в неуправляемом 'std :: _ Optional_destruct_base <_Ty, false> :: $ Безымянный класс $ 0x61d94762 $ 23 $' CLR d: \ visualstudio \ vc \ tools\ msvc \ 14.16.27023 \ include \ необязательный 87

Ошибка C2848 'std :: _ Optional_destruct_base <_Ty, false> :: _ Value': управляемый тип не может быть членом объединения CLR d: \ visualstudio \vc \ tools \ msvc \ 14.16.27023 \ include \ необязательный 87

Ошибка C3699 '&&': невозможно использовать это косвенное указание для типа '_Ty' CLR d: \ visualstudio \ vc \ tools \ msvc \ 14.16.27023\ include \ необязательный 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 \ includee \ необязательный 467

Ошибка C3699 '&&': невозможно использовать это косвенное указание для типа 'const _Ty' CLR d: \ visualstudio \ vc \ tools \ msvc \ 14.16.27023 \ include \ необязательный 476

Так как я могу использовать по желанию?Возможно ли это вообще в C ++ CLI?Какие есть альтернативы?

1 Ответ

0 голосов
/ 08 апреля 2019

Насколько я понимаю, std :: option - это тип значения , который может не содержать значения из-за сбоя.Стандартный способ .Net для решения проблемы такого типа - создать исключение или разрешить распространению исключения.Однако, похоже, что вы не хотите этого делать, так что вот альтернативы.

Для ссылочного типа .Net (объявленного в C # как class, в C ++ / CLI как ref class или ref struct, используемый в C ++ / CLI с ^), способ справиться с этим - просто вернуть nullptr.Типы ссылок очень и очень редко хранятся по значению, а возвращение нуля является гораздо более стандартным.

Для типа значения .Net (объявленного в C # как struct, в C ++ / CLI как value class или value struct, используемого в C ++ / CLI без ^), Я бы использовал System::Nullable<T>.Nullable - это тип, аналогичный Optional, где тип значения может иметь значение null.

...