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

Помогите разобраться с шаблонами - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ как раскрасить стаистический рисунок? http://www.cyberforum.ru/cpp/thread361148.html
#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> void Box(int x1, int y1, int x2, int y2); int main(void) { int xmax, ymax;
C++ диспечер задач пожалуйста скиньте диспечер задач на с++ или на с# у кого есть, а то вообще времени ни на что не хватает, чтоб еще его делать. http://www.cyberforum.ru/cpp/thread360687.html
C++ Пользователь вводит координаты точки (x,y) определить входит ли данная точка в область или нет.
Пользователь вводит координаты точки (x,y) определить входит ли данная точка в область или нет.
C++ Определить типы элементов массива
Уважаемые знатоки, возможно ли выяснить типы элементов массива заданного структурой? типа: struct { short X,Y; String Kto;} Massiv;
C++ Требуется помощь!Робот-фермер.. http://www.cyberforum.ru/cpp/thread357033.html
Доброго времени суток!Требуется помощь ,я только начинаю учить си ++,поэтому прошу проявить терпение в случае чего:). Значит задача такова: Робот фермер различает размер апельсинов ( большие / маленькие), цвет апельсинов(orange- спелые, orange-green - полуспелые и green- зелёные). Он срезает Н апельсины по следующему алгоритму: 1.Спелые апельсины ( orange) он делит...
C++ Разработка для Windows CE Доброго времени суток! Подскажите пожалуйста, что используется для разработки ПО для Windows CE 6 и выше? Слышал, что VS 2008 содержит что-то вроде эмулятора. Есть ли более ранние версии VS, которые так умеют? Какие дополнительные пакеты для этого нужны? подробнее

Показать сообщение отдельно
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.10.2011, 20:21     Помогите разобраться с шаблонами
Если я в этот раз правильно понял, то так. Начните чтение с main().

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
102
103
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <typeinfo>
 
//-------------- адаптер --------------
template <typename X>
class default_adapter
{
public:
    void out( std::ostream & os, X & obj );
};
 
template <typename X>
void default_adapter<X>::out( std::ostream & os, X & obj )
{
    os << obj;
}
 
// специализация адаптера для vector<int>
template <>
void default_adapter< std::vector<int> >::out( std::ostream & os, std::vector<int> & obj )
{
    os << "specialization for <std::vector<int> >:";
    for( std::vector<int>::iterator it = obj.begin(); it != obj.end(); it++ )
        os << ' ' << *it << ';';
}
 
//------------ принтер ------------------
 
                      /*              параметр шаблона объявлен до шаблона  */
template < typename T, typename X = T, class adapter_t = default_adapter< X > >
class printer
{
protected:
    T obj;
    adapter_t adapter;
 
public:
    printer( const T &_obj, const adapter_t &_adapter = adapter_t() ) : obj( _obj ), adapter( _adapter ) {};
 
    void print( std::ostream & os )
    {
        adapter.out( os, obj );
        os << '\n';
    }
};
 
// специализация для printer<float, int, default_adapter<int> >
template <>
void printer< float, int >::print( std::ostream & os )
{
    os << "specialization for <float, int>: ";
    int val = obj;
    adapter.out( os, val );
    os << '\n';
}
 
 
int main()
{
    std::cout << "printer<std::string>: ";
    // строка в качестве T
    // использует обычные шаблоны
    printer< std::string > str_printer( "String data" );
    str_printer.print( std::cout );
 
    //------------------------
 
    std::cout << "printer< std::vector<int> >: ";
 
    std::vector<int> int_vec;
    int_vec.push_back( 8 );
    int_vec.push_back( 16 );
    int_vec.push_back( 32 );
 
    // vector<int> в качестве T
    // испольует специализацию адаптера для vector<int>
    printer< std::vector<int> > vector_printer( int_vec );
 
    vector_printer.print( std::cout );
 
    //------------------------
 
    std::cout << "printer< float, int, default_adapter<int> >: ";
 
    // принтер float, но использует default_adapter<int>
    // (так как второй параметр - int)
    printer<float, int> weird_printer( 3.14f );
    weird_printer.print( std::cout );
 
    //-------------------------
 
    std::cout << "printer< float, int, default_adapter<float> >: ";
 
    // использует default_adapter<float>, так как это явно указано.
    // второй параметр, int, игнорируется
    printer<float, int, default_adapter<float>> normal_printer( 3.14f );
    normal_printer.print( std::cout );
 
    return 0;
}
Добавлено через 2 минуты
Объект printer<float, int> weird_printer использует специализацию. int означает, что в качестве адаптера будет default_adapter<int>
 
Текущее время: 15:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru