我无法弄清楚这一点。创建两个ctors很容易,但我想知道是否有一种简单的方法可以做到这一点。
如何将std::map
作为默认参数传递给ctor,例如
Foo::Foo( int arg1, int arg2, const std::map<std::string, std::string> = VAL)
我已经尝试0
,null
和NULL
作为VAL
,没有任何工作,因为它们都是int类型,g ++抱怨。这里使用的正确默认值是什么?
或者这种事情不是一个好主意吗?
答案 0 :(得分:27)
VAL
的正确表达式为std::map<std::string, std::string>()
。我认为这看起来很长很丑,所以我可能会在类中添加一个public 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
更好。
答案 1 :(得分:6)
您创建了一个初始化值的临时值。例如:
Foo::Foo(int arg1,
int arg2,
const std::map<std::string, std::string>& the_map =
std::map<std::string, std::string>())
{
}
(typedef可能有助于提高代码中的可读性)
答案 2 :(得分:3)
从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;
}
答案 3 :(得分:2)
首先,相反,你正在通过 const value 传递地图,这是毫无意义的,可能不是你真正想要的。您可能希望通过 const reference 传递,这样就不会复制地图,并确保您的函数不会修改地图。
现在,如果您希望默认参数为空地图,可以通过构建它来实现,如下所示:
Foo::Foo( int arg1, int arg2, const std::map<std::string, std::string>& = std::map<std::string, std::string>())