2010-11-08 160 views
10

我一直無法弄清楚這一點。創建兩個ctors很容易,但我想知道是否有一個簡單的方法來完成此操作。如何通過std :: map作爲默認的構造函數參數

如何將std::map作爲默認參數傳遞給控制器​​,例如,

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

我試過0nullNULLVAL,沒有工作,因爲他們都是int類型,G ++抱怨。這裏使用的正確默認值是什麼?

或者這種事情不是一個好主意嗎?

回答

22

正確的表達式VALstd::map<std::string, std::string>()。我認爲,看起來長和醜陋,所以我一個公共的typedef成員可能添加到類:

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

順便說一下,你的意思是最後一個構造函數的參數是一個參考? const map_type&大概比const map_type好。

+5

+1在於把默認值在* *的聲明,而不是在唯一的解決辦法*定義*。 – 2010-11-08 22:38:33

5

您創建一個值初始化的臨時值。例如:

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

(A類型定義可能有助於使這個在你的代碼更易讀)

2

首先,和tangentailly,你是常數值,這是毫無意義的,可能沒有通過地圖你真正想要什麼。您可能需要通過const引用,以便您不需要複製地圖,並確保您的功能不會修改地圖。現在

,如果你希望你的默認參數是一個空的地圖,你通過構建它,像這樣做:

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

由於C++ 11可以使用aggregate initialization

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

例子:

#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; 
} 
相關問題