Форум программистов, компьютерный форум CyberForum.ru

Флаги форматирования и манипуляторы - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Пересчёт даты из Григорианской в Юлианскую http://www.cyberforum.ru/cpp-beginners/thread50045.html
Пишу программу по астрономии, необходимо пересчитать Григорианскую дату в Юлианскую. Вот что навоял: #include <iostream> #include <cstdlib> using namespace std; int main() { int Month, M, Day, D, Year, Y; cout << "Enter Month:"; cin >> Month; cout << "Enter Day:"; cin >> Day;
C++ помогите написать лабу 1. Дано 36-ричное число, содержащее не более 100 цифр (цифры 10,11,...,35 кодируются заглавными латинскими буквами А,В,...,Z). Переставить цифры числа таким образом, чтобы оно стало "счастливым". "Счастливым" будем называть число из N цифр, у которого сумма первых цифр равна сумме последних цифр. Если такая перестановка невозможна, вывести сообщение "impossible" http://www.cyberforum.ru/cpp-beginners/thread50042.html
C++ Поиск звена с элементом el в списке, заданном указателем phead
#include<iostream> using namespace std; class Spisok { private: struct node { int elem; node *sled; };
Перегрузка функции C++
Что такое перезагрузка функции в с++? Для чего она нужна? Есть случаи, когда без нее никак? Приведите пример перезагрузки функции? Тут есть перезагрузка? static int Square(int var) { return (var * var); } static long Square(long var)
C++ Динамическое очищение массива http://www.cyberforum.ru/cpp-beginners/thread49995.html
Помогите пжлст) Нужно в программе при определенных обстоятельствах очистить массив. char n;
C++ Реверсирование строк Всем добрый вечер! Как всегда, практикуюсь по книжным примерам. Вот дошёл до темы реверсирования строк, то есть расположения букв в обратном порядке. Столкнулся с таким кодом, и не ясен стал цикл,то есть как именно происходит замена букв в нём? Если кто может, подскажите,если не сложно? Не ясен сам цикл, и строка перед ним: end = &str; Заранее благодарю. Вот исходник: #include... подробнее

Показать сообщение отдельно
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
24.06.2012, 18:43
То, что простые методы не универсальны — это очевидно. Мне и самому не нравятся многие ограничения, присущие потоковому выводу. Делать простые вещи иногда приходится сложным образом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
 
class char_to_out
{
    char c;
public:
    explicit char_to_out(char c) : c(c)
    {}
    std::ostream& out(std::ostream& os) const
    {
        if (os.flags() & (std::ios::hex | std::ios::oct))
            os << (c & 0xff);
        else
            os << (int)c;
        return os;
    }
};
 
inline
std::ostream& operator<<(std::ostream& os, char_to_out const & c)
{
    return c.out(os);
}
 
int main()
{
    char c = -1;
    std::cout << char_to_out(c) << std::endl;
    std::cout << std::hex << char_to_out(c) << std::endl;
}
В принципе, при выводе вместо char_to_out можно подставить шаблонную функцию для универсальности (или класс параметризовать), но без специализаций здесь не обойтись, похоже. Потоки, похоже, изначально не слишком хорошо продуманы, хотя идея красивой была.

Добавлено через 22 минуты
Более полная версия, которая годится (улучшать можно и дальше) для использования в шаблонах:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
 
template <typename TYPE>
class some_to_out_class
{
    TYPE const& v;
public:
    explicit some_to_out_class(TYPE const& v) : v(v)
    {}
    std::ostream& out(std::ostream& os) const
    {
        return (os << v);
    }
};
 
template <>
inline
std::ostream& some_to_out_class<char>::out(std::ostream& os) const
{
    if (os.flags() & (std::ios::hex | std::ios::oct))
        os << (v & 0xff);
    else
        os << (int)v;
    return os;
}
 
template <>
inline
std::ostream& some_to_out_class<signed char>::out(std::ostream& os) const
{
    if (os.flags() & (std::ios::hex | std::ios::oct))
        os << (v & 0xff);
    else
        os << (int)v;
    return os;
}
 
template <>
inline
std::ostream& some_to_out_class<unsigned char>::out(std::ostream& os) const
{
    return os << (v & 0xff);
}
 
template <typename TYPE>
inline
std::ostream& operator<<(std::ostream& os, some_to_out_class<TYPE> const & v)
{
    return v.out(os);
}
 
template <typename TYPE>
inline
some_to_out_class<TYPE> some_to_out(TYPE const& v)
{
    return some_to_out_class<TYPE>(v);
}
 
int main()
{
    char c = -1;
    std::cout << some_to_out(c) << std::endl;
    std::cout << std::hex << some_to_out(c) << std::endl;
}
Если кто знает методы проще — предлагайте.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru