Как передать std:: map как параметр конструктора по умолчанию
Я не смог понять это. Легко создать два ctors, но я хотел узнать, есть ли простой способ сделать это.
Как передать параметр std::map
в качестве параметра по умолчанию для ctor, например.
Foo::Foo( int arg1, int arg2, const std::map<std::string, std::string> = VAL)
Я пробовал 0
, null
и null
как VAL
, ни одна из работы, потому что они все типа int, g++ жалуется. Какое значение по умолчанию используется здесь?
Или это не очень хорошая идея?
Ответы
Ответ 1
Правильное выражение для 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
.
Ответ 2
Создается инициализированное значение. Например:
Foo::Foo(int arg1,
int arg2,
const std::map<std::string, std::string>& the_map =
std::map<std::string, std::string>())
{
}
(typedef может помочь сделать это более читаемым в вашем коде)
Ответ 3
Во-первых, и касательно, вы передаете карту по значению const, что бессмысленно и, вероятно, не то, что вы действительно хотите. Вероятно, вы захотите перейти по ссылке const, чтобы вы не сделали копию карты, и убедитесь, что ваша функция не изменяет карту.
Теперь, если вы хотите, чтобы ваш параметр по умолчанию был пустой картой, вы делаете это, создавая его так:
Foo::Foo( int arg1, int arg2, const std::map<std::string, std::string>& = std::map<std::string, std::string>())
Ответ 4
С С++ 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::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;
}