2016-01-01 15 views
7

wymyśliłem następujące:zdać kontenera std do funkcji

template <typename T> inline void printcontainer(std::vector<T> container) 
{ 
    for(auto it = container.begin(); it != container.end(); it++) 
    { 
     std::cout << *it << std::endl; 
    } 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::vector<int> v; 
    v.push_back(5); 
    v.push_back(4); 
    v.push_back(3); 
    printcontainer(v); 

    return 0; 
} 

(Przepraszamy za push_backs, visual studio nie akceptuje list initializer ... Fuj !!)

teraz ta funkcja jest ograniczona do std::vector, jak mogę ją ustawić, aby móc przekazywać inne pojemniki, takie jak tablice std::list itd.

+0

Jaka wersja VC++ używasz nie obsługuje list initializer? – MikeMB

+0

Visual Studio 2012, rzeczy takie jak 'std :: vector v {1,2,3};' nie jest obsługiwane, więc musisz użyć obejścia w stylu c-style, z którego całkiem nie wiem. Również nie ma 'std :: initializer_list' dość dziwne eh. –

+0

Tak, przyzwyczaiłem się już do C++ 11, że zapomniałem, że VS zaadoptował wiele/najwięcej? C++ 11 funkcji nie wcześniej niż VS 2013. – MikeMB

Odpowiedz

7

Po prostu nie szablon na typ przechowywany przez kontener, ale na typ sam pojemnik:

template <typename Container> 
inline void printcontainer(const Container &container) 

Zauważ, że zmieniono argument na odniesienie const, aby uniknąć niepotrzebnej kopii.

można generalizować swoją funkcję drukowania do macierzy C przy użyciu non-member std::begin i std::end lub za pomocą range based for loop:

template <typename Container> 
inline void printcontainer(const Container &container) { 
    for (const auto &v : container) 
     std::cout << v << "\n"; 
} 

OT uwaga: Prawdopodobnie nie trzeba inline tutaj.

+0

wow Jestem pod wrażeniem 'for (const auto & v: container)' jak to się nazywa? Będę go badać –

+2

[Zakres dla pętli (od C++ 11)] (http://en.cppreference.com/w/cpp/language/range-for) – Drop

+0

tyvm, przyjmuję tę odpowiedź tak szybko, jak to pozwala! –

2

Przekazywanie obiektów kontenerowych jest przeciwko klasycznemu Stepanovowi STL algorytmowi kontenera-iteratorowi Ogólny styl programowania.

Zazwyczaj jeden minie iteratory:

# define ForwardIterator typename // workaround untill we have concepts 

template <ForwardIterator It> inline void printcontainer(It begin, It end) 
{ 
    for(;begin != end; ++begin) 
    { 
     std::cout << *begin << std::endl; 
    } 
} 

Zastosowanie:

std::vector<int> v = {1, 2, 3, 4}; 
printcontainer(v.cbegin(), v.cend()); 
+0

* "Próbujesz napisać Javę w plikach C++." * W jaki sposób? Nie widzę problemu z przekazaniem tutaj kontenera.W rzeczywistości funkcja boost zapewnia wiele wersji kontenera funkcji opartych na iteratorze w standardowej bibliotece, aby zmniejszyć szczegółowość. (Nie mój dv btw.) –

+0

@BaummitAugen OK, to było trochę za dużo, usuń to wyrażenie;) – Drop

+1

Podczas gdy to nominalnie wydaje się być w porządku, to makro jest po prostu ohydne i zasługuje na lekcję samą w sobie. Również śrubowe iteratory, zakresy są przyszłością. – Puppy

Powiązane problemy