В C++ можно определить операторы преобразования, которые не являются членами класса? Я знаю, как это сделать для обычных операторов (например, +), но не для операторов преобразования.C++ пользовательские операторы преобразования без классов?
Вот мой прецедент: я работаю с библиотекой C, которая передает мне PA_Unichar *
, где библиотека определяет PA_Unichar как 16-битный int. На самом деле это строка, закодированная в UTF-16. Я хочу преобразовать его в std::string
, закодированный в UTF-8. У меня есть весь код преобразования готовый и рабочий, и я только не хватает синтаксический сахар, который позволил бы мне написать:
PA_Unichar *libOutput = theLibraryFunction();
std::string myString = libOutput;
(как правило, в одной строке без переменной TEMP).
Также стоит отметить:
Я знаю, что
std::string
не определяет неявное преобразование изchar*
, и я знаю, почему. Та же причина может быть применена здесь, но это не относится к делу.У меня есть
ustring
, подклассstd::string
, который определяет правильного оператора преобразования отPA_Unichar*
. Он работает, но это означает использование переменныхustring
вместоstd::string
и что тогда требует преобразования вstd::string
, когда я использую эти строки с другими библиотеками. Так что это не очень помогает.Использование оператора присваивания не работает, поскольку те должны быть быть членами класса.
Так же можно определить неявные операторы преобразования между двумя типами вы не контролируете (в моем случае PA_Unichar*
и std::string
), которые могут или не могут быть типами классов?
Если нет, то какие могут быть обходные пути?
что не так? Не много, но все же, две вещи: - визуальный беспорядок, когда у вас есть сотни бессмысленных звонков для преобразования - это решение подразумевает использование временной std :: string. Это означает, что данные копируются дважды, все время. Это может быть или не быть проблемой, но не очень удовлетворительно. –
Большинство компиляторов оптимизируют дополнительную копию. – rlbond
jdmuys> rlbond прав, RVO является обычным и реальным на практике. Вы можете сделать это так: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ – Klaim