2013-08-15 2 views
1
#include<algorithm> 
#include<iostream> 
using namespace std; 

int main() 
{ 
    cout << (uint8_t)123 << endl; 
} 

Это будет выводить {, так как { «s ASCII 123.соиЬ uint8_t в виде целых чисел вместо символов

Но я хочу, чтобы получить 123 вместо этого. Я нашел, что cout << (int)123 << endl; сделает это, но я не желаю бросать uint_8 в int каждый раз. Могу ли я настроить cout для достижения этого?

+0

Почему бы вам не передать фактический int, что вы имеете в виду при каждом запуске вашего кода – aaronman

+0

@aaronman У меня есть функция, которая возвращает массив 'uint_8', я не хочу использовать приведение, когда я попробуйте написать этот массив в cout ... – Sayakiss

+0

если это важно для вопроса, вы должны опубликовать его с остальными, на данный момент вопрос действительно не имеет смысла. – aaronman

ответ

4

Я определенно не одобряю решение, которое я собираюсь предложить. Я также подозреваю, что это не может быть разрешено стандартом, но пока я не могу это доказать. Если кто-то может предоставить мне ссылку, которая показывает, что это не разрешено, я удалю этот ответ. В любом случае, мои тесты пока показывают, что просто перегрузка оператора в глобальной области видимости работает.

#include <iostream> 
#include <cstdint> 

std::ostream & operator<<(std::ostream & os, std::uint8_t val) 
{ 
    return os << static_cast<int>(val); 
} 

int main() 
{ 
    std::uint8_t val = 123; 
    std::cout << val; 
} 

Я бы не подумало, что это будет работать, но потом я понял, что char/unsigned char/signed char перегрузок для operator<< всех свободных функций в std имен подобраны ADL. И я думаю, что глобальные функции считаются лучшими, чем функции ADL, но я не уверен в этом.

+0

Хорошо, что это более умно, чем мое решение. – aaronman

+0

Я думаю, что причина, по которой ваша версия выбрана над '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'потому что [последний] (http: //en.cppreference. com/w/cpp/io/basic_ostream/operator_ltlt2) являются функциональными шаблонами, а версия, которую вы имеете, более специализирована. Если вы также создаете свой шаблон, [по умолчанию выбирается] (http://coliru.stacked-crooked.com/view?id=c61d5d5eb16066c4c2197a22de9a7a8c-6e9f1f680880347f6708b805c806db62); но мой пример, безусловно, является нарушением ODR. Во всяком случае, я не думаю, что вам разрешено предоставлять 'operator <<' для основных типов. – Praetorian

+0

@Praetorian: Да, это имеет смысл. Но почему вы считаете, что это запрещено? Просто чувство кишки? –

Смежные вопросы