mateczek Temat założony przez niniejszego użytkownika |
z ciekawości c++14 » 2016-02-24 08:44:10 Tak mnie zastanawia czy zmienna auto w nowym standardzie spowoduje, że szablony zaczną wychodzić z użycia?? skoro już teraz mogę przy pomocy 'auto' napisać prosty algorytm sortujący dla różnych typów i bez użycia szablonów?? A może coś źle rozumuję ?? Przykład sortowania bąbelkowego dla tablic różnych typów. #include <iostream> using namespace std;
void sortowanie( auto tab[] ) { for( int i = 0; i < 5; i++ ) { for( int j = 0; j < 4; j++ ) { if( tab[ j ] > tab[ j + 1 ] ) std::swap( tab[ j ], tab[ j + 1 ] ); } } }
struct czlowiek { string imie; int wiek; bool operator >( czlowiek & drugi ) { return wiek > drugi.wiek; } };
int main() { int tablica[] = { 1, 5, 2, 4, 3 }; czlowiek tablica1[] = { { "marek", 30 }, { "piotrek", 21 }, { "kasia", 22 }, { "jurek", 28 }, { "basia", 32 } }; sortowanie( tablica ); for( int i = 0; i < 5; i++ ) { cout << tablica[ i ] << " "; } cout << endl; sortowanie( tablica1 ); for( int i = 0; i < 5; i++ ) { cout << tablica1[ i ].imie << " " << tablica1[ i ].wiek << endl; } }
|
|
Gibas11 |
» 2016-02-24 09:36:45 Nie zaalokujesz dynamicznie dodatkowej pamięci (kod1*) , nie utworzysz dodatkowych obiektów danego typu, jeżeli są NonCopyable i kilka innych wad, ale w większości zastosowań się sprawdza. *kod1 void p( auto * i ) { i = new auto; }
Ps. dzięki, przypomniałeś mi, że muszę zaktualizować gcc i g++. ;) |
|
carlosmay |
» 2016-02-24 09:47:21 template < typename T > void print( const T & collection, std::string & opt = "" ) { std::cout << opt; for( const auto & elem: collection ) { std::cout << elem << ' '; } std::cout << std::endl; } Cała biblioteka std to szablony. Nie sądzę żeby auto w jakikolwiek sposób miało szansę je wyprzeć. Jak w tym przykładzie można by bez użycia szablonu do funkcji przekazać prawie dowolny kontener? edit: poprawione. |
|
Gibas11 |
» 2016-02-24 10:00:39 @up #include <iostream> #include <string> #include <vector> #include <list>
void print( const auto & collection, std::string & opt = "" ) { std::cout << opt; for( const auto & elem: collection ) { std::cout << elem << ' '; } std::cout << std::endl; }
int main() { std::vector < int > vektor; for( int i = 5; i < 12; i++ ) vektor.push_back( i ); std::list < int > lista; for( int i = 0; i < 6; i++ ) lista.push_back( i * 5 ); std::string tmp = ""; print( vektor, tmp ); print( lista, tmp ); return 0; }
Ps, twoje rozwiązanie też nie obsługuje wszystkich kontenerów, patrz – std::map. |
|
pekfos |
» 2016-02-24 11:12:14 void p( auto * i ) { i = new auto; } | decltype() + std::remove_pointer<> i po problemie. |
|
Monika90 |
» 2016-02-24 15:30:07 void sortowanie( auto tab[] ) { }
|
Parametry funkcji nie mogą być typu auto w obecnie obowiązującym standardzie C++ (*), ale w przyszłym C++17 być może będą mogły być, (a jak nie w C++17, to w tzw. Concepts TS). Wtedy powyższa definicja będzie równoważna tej template < class T > void sortowanie( T tab[] ) { }
więc od szablonów nie uciekniesz. (*) Nie dotyczy wyrażeń lambda. |
|
Gibas11 |
» 2016-02-24 15:50:36 @up W C++14 (w przeciwieństwie do 11) gcc 5.3 nie narzeka na taką definicję, nie ma nawet ostrzeżeń. |
|
Monika90 |
» 2016-02-24 16:30:29 Dodali, choć to niestandardowe, bo uważali że jest to użyteczne. To że GCC kompiluje kod bez ostrzeżeń nie oznacza że kod jest zgodny ze standardem. |
|
« 1 » 2 |