Как я могу определить неявный тип из моего класса на скаляр?

StackOverflow https://stackoverflow.com/questions/2752999

Вопрос

У меня есть следующий код, который использует класс строк 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());
}

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

Это было полезно?

Решение

Во -первых, я бы порекомендовал вам подумать о том, чтобы не предоставить неявное преобразование. Вы можете обнаружить, что ситуации, когда неожиданные преобразования не пойманы, поскольку ошибки перевешивают стоимость звонка 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top