Я пишу шаблон класса String (только для учебных целей) и имею небольшую проблему. Если T - wchar_t и U - char, и наоборот, что мне не хватает для этого метода?
template<typename U>
String<T> operator + (const U* other)
{
String<T> newString;
uint32_t otherLength = length(other);
uint32_t stringLength = m_length + otherLength;
uint32_t totalLength = stringLength * sizeof(T) + sizeof(T);
T *buffer = new T[totalLength];
memset(buffer, 0, totalLength);
memcpy(buffer, m_value, m_length * sizeof(T));
newString.m_value = buffer;
newString.m_length = stringLength;
memcpy(newString.m_value + m_length, other, otherLength * sizeof(T));
return newString;
}
Хорошо, Джаред ниже предложил решение, так что-то вроде этого (есть ошибки, я знаю, только шаблон)?
template<typename U>
String<T> operator + (const U* other)
{
String<T> newString;
uint32_t sizeOfT = sizeof(T); // wchar_t is 4
uint32_t sizeOfU = sizeof(U); // char is 1
T* convertedString;
int i = 0;
while (*other != 0)
{
convertedString[i] = ConvertChar(*other);
other++;
i++;
}
return newString;
}
template <typename U>
T ConvertChar(U character)
{
}
В настоящий момент ваш код по существу использует копии памяти при конвертации из U*
в String<T>
. Это, к сожалению, не сработает, потому что wchar_t
и char
имеют разные макеты памяти. В частности, wchar_t
обычно занимает 2 байта, а char
- один byte
. То, что вам нужно установить здесь, - это правильная функция преобразования, которая должна применяться к каждому элементу строки
T ConvertChar(U c) { ... }
Хотя вы можете просто расширить при преобразовании из char
в wchar_t
(т. wchar_t(c)
Использовать wchar_t(c)
), но это, вероятно, происходит не так. При преобразовании из wchar_t
в char
очевидно, что вы, вероятно, потеряете информацию. Общепринято, что индивидуальные символы фактически не представляют отдельные символы, а фактически представляют собой байты, представляющие UTF-8 или UTF-16. В этом случае элементы, вероятно, должны быть закодированы/декодированы в соответствующее другое представление. Очевидно, что преобразование не один к одному: некоторые символы Unicode состоят из нескольких байтов UTF-8 и нескольких слов UTF-16.
Возможно, вы захотите взглянуть на std::codecvt<...>
для преобразования кодировок.