Преобразование из CString в char * / TCHAR * - PullRequest
2 голосов
/ 24 августа 2011

Мне хорошо известны методы преобразования CString в символы стиля C.Одним из них является использование strcpy / _tcscpy, а другие включают использование CStrBuf.

Проблема:

char Destination[100];
CStringA Source; // A is for simplicity and explicit ANSI specification.

Source = "This is source string."

Теперь я хочу, чтобы:

Destination = Source;

Произошло автоматически.Ну, это логически означает написание оператора преобразования в классе CString.Но, как бы это ни было неявно, у меня нет привилегий для изменения класса CString.

Я думал о написании оператора глобального преобразования и оператора глобального назначения.Но это не работает:

operator char* (const CStringA&); // Error - At least must be class-type
operator = ... // Won't work either - cannot be global.

Да, безусловно, можно написать функцию (желательно шаблонную).Но это включает в себя вызов функции, и она не является гладкой как оператор присваивания.

Ответы [ 3 ]

2 голосов
/ 24 августа 2011

Вы не можете назначать массивы. Это делает невозможным то, что вы хотите. Кроме того, если честно, это довольно неправильно - буфер размером с магическое число?

1 голос
/ 24 августа 2011

Ну, я не хочу сказать, что это в любом случае рекомендуется, но вы могли бы взломать какой-то менее используемый оператор для быстрого взлома:

void operator<<=(char * dst, const std::string & s)
{
  std::strcpy(dst, s.c_str());
}

int main()
{
  char buf[100];
  std::string s = "Hello";

  buf <<= s;
}

Вы можете даже установить умеренно безопасную шаблонную версию для массивов статического размера:

template <typename TChar, unsigned int N>
inline void operator<<=(TChar (&dst)[N], const std::string & s)
{
  std::strncpy(dst, s.c_str(), N);
}
0 голосов
/ 24 августа 2011

Оператор на CString не решит проблему, так как вам нужно скопировать в буфер Destination, хотя это назначение изменит значение Destination, что невозможно.

Каким-то образом вам нуженОператор для достижения этой строки:

strcpy(Destination, LPCSTR(Source)); // + buffer overflow protection

Как видите, преобразование источника происходит только наполовину.Вам все еще нужно скопировать в буфер назначения.

Кроме того, я бы не рекомендовал это делать, поскольку строка Destination = Source полностью вводит в заблуждение относительно семантики char[].

ЕдинственноеВозможно, такое присвоение будет инициализация Destination:

char Destination[100] = Source;
...