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

Не понимаю манипуляторы. Как они работают? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ C, Массивы http://www.cyberforum.ru/cpp-beginners/thread442709.html
Здравствуйте у меня есть два вопроса, как заполнить массив случайными словами (в моем случае именами). И второй как данные из одного массива перенести в другой, например в одном массиве у меня есть какие то числа, мне нужно уже в другом массиве найти самое большое или самое маленькое.
C++ Последовательность задана рекуррентным соотношением. Вычислить заданный элемент последовательности проверте код пожалуйста вроде не точно вычисляет #include<iostream> #include<conio.h> using namespace std; int main(){ int i,n; float v; v=0;v=0;v=1.5; cout<<"vvedite n bol'we 3"<<endl; cin>>n; http://www.cyberforum.ru/cpp-beginners/thread442708.html
Дано действительное число x 0. Вычислить C++
Дано действительное число x 0. Вычислить
C++ Даны действительные числа х , у. Определить, принадлежит ли точка с координатами x , у заштрихованной части плоскости
проверте код #include <stdio.h> #include <conio.h> #include <math.h> #include <iostream.h> main () { float x,y; printf("vvedite x i y\n"); scanf("\n%e\n%e",&x,&y);
C++ поиск количества делителей чисел от 1 до N http://www.cyberforum.ru/cpp-beginners/thread442691.html
итак задача нужно посчитать кол-во чисел с одинаковым количество делителей, взять число перестановок, все перемножить, отнять единицу. хранить кол-во чисел с кол-вом делителей можно в массиве (назовем его DEL) (кол-во делителей оценивается для больших N как корень третьей степени, т.е. тут максимум 2600 массив понадобится). проблема как отыскать сколько у какого числа делителей. пока придумал...
C++ Программа, генерирующая 3 последовательности из 10-и случайных чисел Приветствую, уважаемые пользователи=) Помогите пожалуйста с задачкой, или покажите, где можно прочитать о этой функции, я не с компа(желательно линку дать прямую) Написать программу, которая генерирует три последовательности из 10-и случайных чисел в диапазоне от 1 до 10, и вывести каждую последовательность на экран. Вычеслить среднее арифметическое каждой последовательности. подробнее

Показать сообщение отдельно
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
08.02.2012, 15:50     Не понимаю манипуляторы. Как они работают?
AzaKendler, мне тоже в голову пришёл вариант с "операторными скобками", но без наследования. Сейчас попробую накидать...

Добавлено через 6 минут
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
65
66
67
68
#include <iostream>
 
class MultiplyByTenManipException : std::exception
{
public:
    virtual ~MultiplyByTenManipException() throw()
    {
    }
 
    virtual const char *what() const throw()
    {
        return "impossible output the value bypassing stream";
    }
};
 
class MultiplyByTenEndManip
{
};
 
class MultiplyByTenBeginManip
{
public:
    MultiplyByTenBeginManip(std::ostream *stream = 0):
    m_stream(stream)
    {
    }
    
    template<typename T>
    MultiplyByTenBeginManip operator <<(T value)
    {
        if (m_stream == 0)
            throw MultiplyByTenManipException();
 
        *m_stream << value * 10;
 
        return *this;
    }
 
    MultiplyByTenBeginManip operator <<(const char *str)
    {
        *m_stream << str;
 
        return *this;
    }
 
    std::ostream& operator <<(const MultiplyByTenEndManip&)
    {
        return *m_stream;
    }
 
    friend MultiplyByTenBeginManip operator <<(std::ostream& stream, const MultiplyByTenBeginManip& manip)
    {
        return MultiplyByTenBeginManip(&stream);
    }
 
private:
    std::ostream *m_stream;
};
 
MultiplyByTenBeginManip multiply_by_ten_begin;
MultiplyByTenEndManip multiply_by_ten_end;
 
int main()
{
    std::cout << multiply_by_ten_begin << 42 << "  " << 3.7 << multiply_by_ten_end << std::endl;
 
    return 0;
}
http://liveworkspace.org/code/24cc96...f7575612280b8a

Добавлено через 7 минут
Ну и под конец кретиффчег - манипулятор, применяющий к последовательности значений (вплоть до "закрывающего" манипулятора) некоторую функцию (правда получилось не совсем так, как хотелось, ну да ладно):

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
 
class TransformManipulatorException : std::exception
{
public:
    virtual ~TransformManipulatorException() throw()
    {
    }
 
    virtual const char *what() const throw()
    {
        return "impossible output the value bypassing stream";
    }
};
 
class TransformManipulatorEnd
{
};
 
template<typename Function>
class TransformManipulatorBegin;
 
template<typename Function>
TransformManipulatorBegin<Function> operator <<(std::ostream& stream,
    const TransformManipulatorBegin<Function>& manip);
 
template<typename Function>
class TransformManipulatorBegin
{
public:
    TransformManipulatorBegin(Function *func, std::ostream *stream = 0):
    m_func(func),
    m_stream(stream)
    {
    }
    
    template<typename T>
    TransformManipulatorBegin operator <<(T value)
    {
        if (m_stream == 0)
            throw TransformManipulatorException();
 
        *m_stream << m_func(value);
 
        return *this;
    }
    
    TransformManipulatorBegin<Function> operator <<(const char *str)
    {
        if (m_stream == 0)
            throw TransformManipulatorException();
 
        *m_stream << str;
 
        return *this;
    }
    
    std::ostream& operator <<(const TransformManipulatorEnd&)
    {
        return *m_stream;
    }
 
    friend TransformManipulatorBegin<Function> operator << <Function>(std::ostream& stream,
        const TransformManipulatorBegin<Function>& manip);
 
private:
    Function *m_func;
    std::ostream *m_stream;
};
 
template<typename Function>
TransformManipulatorBegin<Function> operator <<(std::ostream& stream,
    const TransformManipulatorBegin<Function>& manip)
{
    return TransformManipulatorBegin<Function>(manip.m_func, &stream);
}
 
int func(int val)
{
    return val * 10;
}
 
double func2(double val)
{
    return val / 2.0;
}
 
int main()
{
    std::cout << TransformManipulatorBegin<int(int)>(func)
                 << 10 << "  " << 42
                 << TransformManipulatorEnd()
              << std::endl;
    
    std::cout << TransformManipulatorBegin<double(double)>(func2)
                 << 10.8 << "  " << 42.22
                 << TransformManipulatorEnd()
              << std::endl;
 
    return 0;
}
http://liveworkspace.org/code/b1e1e8...daa6a9d0809b32
 
Текущее время: 02:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru