перегрузка оператора ostream для неподписанного символа в C ++ - PullRequest
3 голосов
/ 06 июля 2011

Дано:

typedef struct { char val[SOME_FIXED_SIZE]; } AString;
typedef struct { unsigned char val[SOME_FIXED_SIZE]; } BString;

Я хочу добавить оператор ostream <<, доступный для AString и BString.

std::ostream & operator<<(std::ostream &out, const AString &str)
{ 
   out.write(str.val, SOME_FIXED_SIZE);
   return out;
}

Если я сделаю то же самое для BString, компилятор пожалуется на invalid conversion from 'const unsigned char*' to 'const char*'.ostream.write не имеет const unsigned char* в качестве аргумента.

Кажется, << сам принимает const unsigned char, поэтому я пытаюсь что-то вроде этого

std::ostream & operator<<(std::ostream &out, const BString &str)
{ 
    for (int i=0; i<SOME_FIXED_SIZE; i++)
    {
        out<<str.val[i];
    }
    return out;
}

Может кто-нибудь сказать мне, если это правильно / хорошая практика или есть какие-то лучшие способы?Приветствую любые комментарии!

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

Самое простое и чистое решение - создать std::string, например:

out << std::string(str.val, str.val + sizeof(str.val));

Однако возникает вопрос: хотите ли вы форматированный или неформатированный вывод?Для неформатированного вывода, каким бы уродливым он ни был, я бы просто использовал reinterpret_cast.

0 голосов
/ 06 июля 2011

Задумывались ли вы о приведении его к char*:

std::ostream & operator<<(std::ostream &out, const BString &str)
{ 
   out.write(reinterpret_cast<char*>(str.val), sizeof(str.val));
   return out;
}
...