2010-11-08 11 views
10

Nie udało mi się tego rozgryźć. Łatwo jest stworzyć dwóch lekarzy, ale chciałem się dowiedzieć, czy istnieje prosty sposób na zrobienie tego.Jak przekazać std :: map jako domyślny parametr konstruktora

Jak można przekazać std::map jako parametr domyślny do ctor, np.

Foo::Foo(int arg1, int arg2, const std::map<std::string, std::string> = VAL) 

Próbowałem 0, null i NULL jak VAL, żaden z pracy, bo wszystkie są typu int, g ++ narzeka. Jaka jest poprawna wartość domyślna do zastosowania tutaj?

Czy to nie jest dobry pomysł?

Odpowiedz

22

Prawidłowe wyrażenie VAL jest std::map<std::string, std::string>(). Myślę, że wygląda długa i brzydka, więc pewnie bym dodać członka typedef publicznego do klasy:

class Foo { 
public: 
    typedef std::map<std::string, std::string> map_type; 
    Foo(int arg1, int arg2, const map_type = map_type()); 
    // ... 
}; 

A tak przy okazji, czy masz na myśli w ostatnim argumencie konstruktora, aby być punktem odniesienia? const map_type& jest prawdopodobnie lepszy niż tylko const map_type.

+5

+1 za to, że jedynym rozwiązaniem, które umieścić wartość domyślną w deklaracji * a nie w *definicja*. –

5

Tworzysz zainicjowany wartością tymczasową. Na przykład:

Foo::Foo(int arg1, 
     int arg2, 
     const std::map<std::string, std::string>& the_map = 
      std::map<std::string, std::string>()) 
{ 
} 

(typedef może pomóc, aby ta bardziej czytelny w kodzie)

2

pierwsze, a tangentailly, jesteś przejazdem mapę przez wartości const, co jest niepotrzebne i prawdopodobnie nie czego tak naprawdę chcesz. Prawdopodobnie chcesz przejść przez const o numerze referencyjnym, aby nie wykonać kopii mapy i upewnić się, że funkcja nie modyfikuje mapy.

Teraz, jeśli chcesz, aby Twój domyślny parametr być pusta mapa, robisz to konstruując go, tak jak poniżej:

Foo::Foo(int arg1, int arg2, const std::map<std::string, std::string>& = std::map<std::string, std::string>()) 
0

Ponieważ C++ 11 można użyć aggregate initialization:

void foo(std::map<std::string, std::string> myMap = {}); 

Przykład:

#include <iostream> 
#include <map> 
#include <string> 

void foo(std::map<std::string, std::string> myMap = {}) 
{ 
    for(auto it = std::begin(myMap); it != std::end(myMap); ++it) 
     std::cout << it->first << " : " << it->second << '\n'; 
} 

int main(int, char*[]) 
{ 
    const std::map<std::string, std::string> animalKids = { 
     { "antelope", "calf" }, { "ant", "antling" }, 
     { "baboon", "infant" }, { "bear", "cub" }, 
     { "bee", "larva" }, { "cat", "kitten" } 
    }; 

    foo(); 
    foo(animalKids); 

    return 0; 
}