2015-10-30 18 views
11

Wydaje się, że sposób, w jaki większość ludzi ma rozmiar string, polega na użyciu tylko my_string.size() i działa dobrze. Cóż, ostatnio zrobił zadanie dla klasy, w których zrobiłem ...Czy C++ ma darmową funkcję "size (object)"?

if (size(my_string) < 5) 
    store[counter].setWeight(stoi(my_string)); 

Zamiast ....

if (my_string.size() < 5) 
    store[counter].setWeight(stoi(my_string)); 

Ale ku mojemu zdziwieniu mój instruktor, który moim zdaniem jest uruchomiony starszy kompilator , nie był w stanie uruchomić tego wiersza kodu. Na moim kompilatorze działa on w obie strony i nie jestem do końca pewien dlaczego.

kompletny program (wyprowadza 4 dla obu):

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

int main() 
{ 
    string myvar = "1000"; 
    cout << "Using size(myvar) = " << size(myvar) << endl; 
    cout << "Using myvar.size() = " << myvar.size() << endl; 
} 

Jeśli ktoś może rzucić nieco światła na to, dlaczego moje rozwiązanie problemu pracował na moim komputerze, ale nie moi profesorowie? Ponadto używam VS2015.

+1

Jaki jest typ 'temp'? Do czego służy funkcja 'sizeof'? –

+5

Wymienne wielkości (x) i x.size() są proponowane dla C++ 17 –

+0

Temp jest typu string i temp.size() i size (temp) są zaprojektowane tak, aby uzyskać ile znaków jest w temp; ku mojemu zdziwieniu obaj zwrócą tę samą wartość, a rozmiar nie jest zdefiniowany nigdzie indziej w moim programie, ponieważ myślałem o tym również. – Feek

Odpowiedz

11

MSVS 2015 ma size funkcję zdefiniowaną w xutility

template<class _Container> 
auto inline size(const _Container& _Cont) 
    -> decltype(_Cont.size()) 
{ // get size() for container 
return (_Cont.size()); 
} 

Jest to funkcja, która jest wykorzystywana podczas rozmowy

cout << "Using size(myvar) = " << size(myvar) << endl; 

To nie jest standard C++ 11/14 funkcja i nie będzie działał pod numerem gcc lub clang

Zostało to szczegółowo opisane w poście na blogu C++11/14/17 Features In VS 2015 RTM

+0

Uzgodnione. Ponieważ nie ma go w MSVS 2013, jest to najprawdopodobniej wczesna implementacja funkcji C++ 17. (Chciałabym, żeby przestali to robić --.-) [edytuj: potwierdzone przez uwagi do wydania - warte dodania odpowiedzi?] –

+0

@LightnessRacesinOrbit Zgoda. Powinny one uczynić to opcją – NathanOliver

+1

Odkładając na bok, nawet powstrzymując się od 'using namespace std;' ([Dlaczego "używa" przestrzeni nazw standardowej "uważano za złą praktykę?] (Http://stackoverflow.com/questions/1452721/why- is-using-namespace-std-thought-bad-practice)) nie zmieniłoby niczego ze względu na [ADL] (http://en.cppreference.com/w/cpp/language/adl), jako 'std: : string' jest również w 'std'. – Deduplicator

11

size to właściwie funkcjonalność C++ 17. Prawdziwa korzyść jest podobna do korzyści begin i end z C++ 11.

Należy zauważyć, że pierwsza definicja size po prostu zwraca metodę wielkości kontenera.

Więc jeśli mam szablonie funkcję tak:

template <typename T> 
auto foo(const T& bar) { return bar.size(); } 

ten może być używany tylko z pojemników, ale jeśli zmieni się:

template <typename T> 
auto foo(const T& bar) { return size(bar); } 

To może być używany z C- również tablice stylów. Dodałem tutaj przykład na żywo: http://melpon.org/wandbox/permlink/Rlpi5wueA14JOW2P

Podsumowując, zawsze powinieneś używać size, jeśli masz C++ 17 lub lepsze wsparcie, ponieważ poprawi to możliwość wielokrotnego użycia w różnych typach kontenerów i tablic.

+0

@Deduplicator Zdaję sobie sprawę, że 'void main()' jest tylko Microsoft. Ponieważ Microsoft ma jedyny kompilator, który obsługuje to teraz, pomyślałem, dlaczego nie. Jeśli jednak tak cię irytuje, że musisz edytować odpowiedź, dodaj "return 0;". Mam zamiar wycofać na razie. Jeśli czujesz się wystarczająco przekonany, aby spróbować ponownie, i dodajesz "powrót", nie będę go wycofywał. –

+0

@ JonathanMee: W C++ i C99 + 'return 0;' na końcu 'main' jest niejawny. Tak więc nie dodałem go. Tak, [MS listuje 'void main()' jako specyficzne dla MS] (https://msdn.microsoft.com/en-us/library/6wd819wh.aspx), ale czy jest jakikolwiek powód by ograniczać twój kod do ich kompilatora ? Inne standardowe biblioteki wkrótce dodadzą więcej funkcji C++ 1z. – Deduplicator

+0

@Deduplicator Wha? 'return 0' na końcu' main' jest niejawne? Czy możesz dać mi referencję? –

Powiązane problemy