2010-05-02 2 views
0

У меня есть следующий код, который использует строковый класс Unicode из библиотеки, что я пишу:Как определить неявный typecast от моего класса до скаляра?

#include <cstdio> 
#include "ucpp" 
main() { 
    ustring a = "test"; 
    ustring b = "ing"; 
    ustring c = "- -"; 
    ustring d; 
    d = "cafe\xcc\x81"; 
    printf("%s\n", (a + b + c[1] + d).encode()); 
} 

Метод кодирования из экземпляров класса ustring преобразует внутренний Unicode в UTF-8 полукокс *. Однако, поскольку у меня нет доступа к определению класса char, я не уверен, как я могу определить неявный typecast (так что мне не нужно вручную вызывать кодировку при использовании с printf и т. Д.).

ответ

7

Во-первых, я бы рекомендовал вам рассмотреть возможность предоставления неявного преобразования. Вы можете обнаружить, что ситуации, когда неожиданные конверсии не пойманы, поскольку ошибки перевешивают стоимость звонка encode, когда вы хотите char*.

Если вы решили обеспечить неявное преобразование вы объявляете это так (внутри определения класса

operator char*(); 

Вы могли бы быть в состоянии сделать метод сопзИте, в этом случае вы можете использовать:.

operator char*() const; 

Обычно вы также хотите, чтобы вернуть указатель на немодифицируемые буфера:

operator const char*() const; 

В теле вашей функции вы должны указать return соответствующий указатель. Поскольку клиенты с неявным преобразованием не ожидали бы освобождения возвращаемого буфера, поэтому, если вам нужно создать специальный буфер для возвращаемого значения, вам нужно будет поддерживать указатель на этот буфер до подходящего момента, чтобы освободить его. Обычно такой подходящий момент может быть следующей мутационной операцией на вашем объекте класса.

Обратите внимание, что как printf принимает любое количество и тип необязательных аргументов, вам все равно нужно было бы использовать объект класса в любом случае.

printf("%s\n", static_cast<const char*>(a + b + c[1] + d)); 

или

printf("%s\n", (const char*)(a + b + c[1] + d)); 

Оба эти более многословен, чем явный вызов encode.

+0

+1 Больше лучшего объяснения, чем у меня :) – AraK

+0

Большое спасибо за совет. Я буду думать о плюсах и минусах и проверить, действительно ли имплицитно. –

+0

(Извините, что вы еще не приняли свой ответ, поэтому ограничивают мою частоту приема, поэтому я должен подождать несколько минут) –