Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Шаблоны


Автор: try_to_get 22.7.2007, 19:16
Что такое шаблоны?
Что из себя представляют шаблоны функций и шаблоны классов?
Кому не трудно напишите, в общем, и кратко выше указанные вопросы.
 smile

Автор: Daevaorn 22.7.2007, 19:51
http://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29

Автор: try_to_get 22.7.2007, 21:14
Thanks!  smile 

Автор: dimanwv 30.3.2012, 08:34
такой вопрос. 
template <typename T>
void show(const char *msg,vector<T> vect)
{
    cout<<msg;
    for(unsigned i=0;i<vect.size();++i)
        cout<<vect[i]<<" ";
    cout<<"\n";
}
vector<int> copied(5);
show<int>("Vector have been sorted :",copied);// здесь в угловых скобках указываем тип.
///////////////////////////////////////////////////////////
template<typename InIter>
void show_range(const char* msg,InIter start,InIter end)
{
    InIter itr;
    cout<<msg;
    for(itr=start;itr!=end;++itr)
        cout<<*itr<<" ";
    cout<<endl;
}
vector<double> trans_v;
    for(trans_i=0;trans_i<10;++trans_i)
        trans_v.push_back(static_cast<double>(trans_i));
    cout<<"The demonstration \"transform\" algorithm using one vector.\n";
    show_range("The initial content of \"trans_v\" is :\n",trans_v.begin(),trans_v.end());//здесь в не применяем угловые скобки почему?

Автор: borisbn 30.3.2012, 10:08
dimanwv, для функций почти никогда не нужно указывать тип инстанцирования явно. А вот для классов - обязательно. Компилятор сам "сообразит" какой тип ты имел в виду. Если же тип не подойдёт, то компилятор ругнётся, как, впрочем, если ты явно укажешь несоответствующий тип.
Кстати, в твоём случае для функции show необязательно указывать тип.
http://liveworkspace.org/code/96f0209d92649342e328424664f8c7d7

Автор: dimanwv 30.3.2012, 23:03
Спасибо. Понял.

Автор: sergioK1 31.3.2012, 12:11
Цитата(borisbn @ 30.3.2012,  09:08)

Кстати, в твоём случае для функции show необязательно указывать тип.
http://liveworkspace.org/code/96f0209d92649342e328424664f8c7d7

1) где разница между двумя примерами  ?

2) зачем тут вообще template ? 
         

Код

  #include <iostream>
 #include <vector>
 using namespace std;


void show(const char *msg,vector<void*> vect)
{
    cout<<msg;
    for(unsigned i=0;i<vect.size();++i)
        cout<<vect[i]<<" ";
    cout<<"\n";
}

int main() {
  vector<void*> copied(5);
  show("Vector have been sorted :",copied);
}


Автор: boostcoder 31.3.2012, 12:25
Цитата(sergioK1 @  31.3.2012,  12:11 Найти цитируемый пост)
1) где разница между двумя примерами  ?

2) зачем тут вообще template ? 

ты в танке?
почему твой код не работает?: http://liveworkspace.org/code/c46ca9cff00880b3ffaba34b20f0d13f

Автор: sergioK1 31.3.2012, 13:02
Цитата(boostcoder @ 31.3.2012,  11:25)
Цитата(sergioK1 @  31.3.2012,  12:11 Найти цитируемый пост)
1) где разница между двумя примерами  ?

2) зачем тут вообще template ? 

ты в танке?
почему твой код не работает?: http://liveworkspace.org/code/c46ca9cff00880b3ffaba34b20f0d13f

мой работает,  твое изменение - нет ,  хочешь добавить чего пользуй  визитор ,


не совсем точьно выразился,  в таких случаях лучше пользовать void* а в самой функции делать фактори на тип ,
 так багу в перегруженом << поймать легче, ну и размер кода поменьше 

xм .. может у меня привычка многолетняя  из других языков без шаблонов писать (там их просто небыло) 
но мне кажеться она хорошая , шаблоны они несколько для другого 

Но это уже  не для новичков, раздела парадигмы програмирования на форуме к сожалению нет , а это 
для туда классика IMHO.






Автор: borisbn 31.3.2012, 13:16
sergioK1, функция show из первого примера умет распечатывать любой вектор, элементы которого умеет принимать оператор << ostream'а
Даже из таких элементов
Код

struct MyStruct {
    int i;
    std::string s;
    MyStruct() : i( 42 ), s( "Hi, sergioK1!" ) {}

    friend std::ostream & operator<<(  std::ostream & os, const MyStruct & p ) {
        os << "{ i: " << p.i << "; s: " << p.s << " }";
        return os;
    }
};

http://liveworkspace.org/code/4faa30d0137702de88e006daac2e2a39

Автор: sergioK1 31.3.2012, 13:27
Цитата(borisbn @ 31.3.2012,  12:16)
sergioK1, функция show из первого примера умет распечатывать любой вектор, элементы которого умеет принимать оператор << ostream'а

Я о другом 

Кстати, в твоём случае для функции show необязательно указывать тип.
http://liveworkspace.org/code/96f0209d9264...328424664f8c7d7 


запутался  smile 
какой прмер первый , какой второй ?

где он указан и где можно не указать ?

Автор: boostcoder 31.3.2012, 14:03
sergioK1, ты когда-нибудь перестанешь на всех форумах рунета постить бессмысленные вопросы?

Автор: borisbn 31.3.2012, 17:24
sergioK1, действительно, сумбур какой-то...

Цитата(sergioK1 @  31.3.2012,  13:27 Найти цитируемый пост)
где он указан и где можно не указать ?

Можно не указывать тип практически всегда. Компилятор сам разберётся какой тип нужен.
Вот вариант, когда тип нужно указывать явно
http://liveworkspace.org/code/b2ce6674e59058193b979d7270dc493d

Автор: sergioK1 31.3.2012, 18:50

 дайте ссылку на стандард языка, только не на последний, 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)