2016-03-31 10 views
0

mir das Schreiben gestaffeltenKomfort-Schicht für std :: Algorithmus

void no_fun(std::vector<int> & vec) 
{ 
    std::sort(vec.begin(), vec.end(),my_comp); 
} 

ich so etwas wie diese

void fun(std::vector<int> & vec) 
{ 
    std::sort(vec,my_comp); 
} 

Frage Wie kann ich erreichen, schreiben mag, dass

Was ich bisher probiert habe

namespace std 
{ 

template<typename T> 
void sort(std::vector<T> & vec) 
{ 
    sort(vec.begin(), vec.end()); 
} 

template<typename T, class Compare > 
void sort(std::vector<T>& vec, Compare comp) 
{ 
    sort(vec.begin(), vec.end(), comp); 
} 

} 

ich es mit Visual Studio 2013 getestet, aber es funktioniert nicht

+2

Sie sollten dem 'std'-Namespace nichts hinzufügen. – Dennis

+1

Es ist nicht erlaubt, 'namespace std' Funktionen oder Funktionsüberladungen hinzuzufügen, aber Sie können diese Funktionen außerhalb dieses Namensraums platzieren. In jedem Fall sollten Sie klären, welche Fehler Sie als "funktioniert nicht" nicht viel erfahren. – interjay

+2

Verwenden Sie die Bereichsbibliothek –

Antwort

3

Zu allererst Ihrem no_fun() wirklich Paar von Iteratoren (aka-Bereich) und nicht einen Behälter Bezug nehmen soll. Der Grund, warum es in C++ immer noch keine Bereiche gibt und warum Container nicht implizit in diese Bereiche konvertiert werden, steht hier außer Frage. Davon abgesehen, eine Sache, die Sie vielleicht zu tun ist, ein Makro zu definieren, wie

using std::begin; 
using std::end;  
#define ALL(c) begin(c), end(c) 

Dann können Sie schreiben

std::sort(ALL(your_vec)); 

Nur sicher sein, nicht um es in einer Header-Datei.

+0

Warum nicht in einen Header setzen? – user1235183

+0

Es ist nicht, weil etwas sofort gebrochen wird, wenn Sie es tun. Aber Sie verschmutzen den globalen Namespace und eines Tages kann es Sie zurückbeißen – Slava

+3

@ user1235183 Denn wenn Sie den globalen Namespace mit einem 3-Buchstaben-Makro verschmutzen, wird Wahnsinn folgen. Dies ist eine faire Warnung :) –