簡體   English   中英

如何將 std::map 作為默認構造函數參數傳遞

[英]How to pass std::map as a default constructor parameter

我一直無法弄清楚這一點。 創建兩個 ctors 很容易,但我想了解是否有一種簡單的方法可以做到這一點。

如何將std::map作為默認參數傳遞給 ctor,例如

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

我試過0nullNULL作為VAL ,沒有任何工作,因為它們都是 int 類型,g++ 抱怨。 這里使用的正確默認值是什么?

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

VAL的正確表達式是std::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更好。

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

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

(typedef 可能有助於使您的代碼更具可讀性)

從 C++11 開始,您可以使用聚合初始化

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::cbegin(myMap); it != std::cend(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;
}

你可以在Godbolt 上玩這個例子。

首先,切線地,您通過const value傳遞地圖,這是毫無意義的,可能不是您真正想要的。 您可能希望通過const reference傳遞,這樣您就不會復制地圖,並確保您的函數不會修改地圖。

現在,如果您希望默認參數為空映射,則可以通過構造它來實現,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM