Как передать std::map в качестве параметра конструктора по умолчанию

Я не смог понять это. Создать два ctor легко, но я хотел узнать, есть ли простой способ сделать это.

Как можно передать std::map в качестве параметра по умолчанию для ctor, например.

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

Я пробовал 0, null и NULL как VAL, ничего не работает, потому что все они имеют тип int, жалуется g++. Какое правильное значение по умолчанию здесь использовать?

Или такие вещи не очень хорошая идея?


person recipriversexclusion    schedule 08.11.2010    source источник


Ответы (4)


Правильное выражение для 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.

person aschepler    schedule 08.11.2010
comment
+1 за то, что это единственное решение, которое помещает значение по умолчанию в декларацию, а не в определение. - person André Caron; 09.11.2010

Вы создаете инициализируемый значением временный файл. Например:

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

(Typedef может помочь сделать это более читабельным в вашем коде)

person James McNellis    schedule 08.11.2010

Начиная с 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.

person Phidelux    schedule 09.11.2017

Во-первых, вы передаете карту по константному значению, что бессмысленно и, вероятно, не то, что вам действительно нужно. Вероятно, вы захотите обойти константную ссылку, чтобы не создавать копию карты и убедиться, что ваша функция не изменяет карту.

Теперь, если вы хотите, чтобы ваш параметр по умолчанию был пустой картой, вы делаете это, создавая его, например:

Foo::Foo( int arg1, int arg2, const std::map<std::string, std::string>& = std::map<std::string, std::string>())
person John Dibling    schedule 08.11.2010