Как определить неявное приведение типа из моего класса в скаляр? - PullRequest
0 голосов
/ 02 мая 2010

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

#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, я не уверен в том, как определить неявное приведение типов (чтобы мне не пришлось вручную вызывать кодирование при использовании с printf и т. Д.)

1 Ответ

7 голосов
/ 02 мая 2010

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

Если вы решили предоставить неявное преобразование, вы объявляете его следующим образом (внутри определения класса.

operator char*();

Вы можете сделать метод const, в этом случае вы можете использовать:

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.

...