Можно ли определить неявное или явное преобразование между типами сторонних библиотек? [Дубликат]

Вы используете объект, содержащий ссылку нулевого значения. Таким образом, он дает пустое исключение. В примере строковое значение равно null, и при проверке его длины произошло исключение.

Пример:

string value = null;
if (value.Length == 0) // <-- Causes exception
{
    Console.WriteLine(value); // <-- Never reached
}

Ошибка исключения:

Необработанное исключение:

System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта. в Program.Main ()

2
задан Dave Mateer 25 May 2010 в 18:48
поделиться

4 ответа

Если вы хотите сказать

QStrign qs;
UnicodeString us(qs);

или

UnicodeString us;
QString qs(us);

, то нет, вы не можете этого сделать, если не можете изменить либо из классов. Конечно, вы можете ввести новую строку:

NewString ns;
UnicodeString us(ns);
QString qs(us);

NewString nsus(us);
NewString nsqs(qs);

Я не уверен в элегантности этого подхода, хотя по сравнению с вашими двумя явными функциями преобразования.

2
ответ дан wilhelmtell 24 August 2018 в 05:36
поделиться
  • 1
    Благодаря; Мне было просто любопытно, было ли что-то на том языке, которого я отсутствовал. Похоже, что первоначальный способ примерно такой же простой, как вы можете получить. – Dave Mateer 2 June 2010 в 16:15

Вы всегда можете делать именно то, что делаете, но заставляете его больше походить на кастинг. Для этого может быть даже разумный аргумент, например, возможность переопределения для большего количества типов и сохранения того же синтаксиса.

Рассмотрим:

template < typename DestType, typename SourceType >
DestType string_cast(SourceType const& source)
{
  return string_cast_impl<DestType,SourceType>::apply(source);
}

template < typename DestType, typename SourceType >
struct string_cast_impl;

template < >
struct string_cast_impl<QString,icu_44::UnicodeString>
{
  QString apply(icu_44::UnicodeString const& val) { return MyProject::ToQString(value); }
};

// etc...

Вы можете не использовать struct impl (потому что вам не нужно частично специализироваться ... когда-либо), или вы можете подумать об увеличении его, чтобы вы могли использовать enable_if. Во всяком случае, у вас будет общий интерфейс для преобразования типа строки, так что вам не нужно запоминать, какую функцию вызывать ... просто вызовите string_cast & lt; Dest> (source).

Edit: подумайте об этом, я делаю то, что вы делаете в одном из моих проектов, для преобразования из std :: string в / из std :: wstring. Я думаю, что я воспользуюсь этой альтернативой, чтобы заменить это.

7
ответ дан Crazy Eddie 24 August 2018 в 05:36
поделиться

Возможным решением было бы обернуть эти типы и предоставить явные конструкторы преобразования. Я так понимаю, вы не можете изменить источник как QString, так и icu_44::UnicodeString, который был бы самым естественным местом для конструкторов преобразования. Использование ключевого слова explicit запрещает неявное преобразование, поэтому преобразования могут возникать только тогда, когда вы пишете QString converted(original) с original значением типа icu_44::UnicodeString или наоборот.

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

0
ответ дан Pieter 24 August 2018 в 05:36
поделиться

Боковой вопрос, вы хотите использовать пространство имен 4.4 напрямую, а не только icu :: UnicodeString?

0
ответ дан Steven R. Loomis 24 August 2018 в 05:36
поделиться
  • 1
    Я действительно не понял, что такое пространство пространства ICU. Я компилирую с -DU_USING_ICU_NAMESPACE = 0, но все же могу ссылаться непосредственно на UnicodeString (без пространства имен) в моем коде, и он отлично работает. Но я также могу использовать icu_44 :: UnicodeString (но не icu :: UnicodeString). Я использую icu_44 :: UnicodeString, потому что, возможно, другая является старой библиотекой? Не уверен. Все еще работаю над этим .... – Dave Mateer 2 June 2010 в 19:06
  • 2
    Сопоставление icu с icu_44 является функцией переименования символов. Если вы скомпилируете с -DU_DISABLE_RENAMING = 1 (или используйте параметр -disable-renaming для настройки), этого не произойдет. Это влияет на символы. Другая - не более старая библиотека. Я бы просто обратился к UnicodeString без пространства имен и оставил переименование как есть. – Steven R. Loomis 4 June 2010 в 20:11
Другие вопросы по тегам:

Похожие вопросы: