13

我一直无法弄清楚这一点。创建两个 ctor 很容易,但我想知道是否有一种简单的方法可以做到这一点。

如何将 astd::map作为默认参数传递给 ctor,例如

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

我已经尝试过0,nullNULLas VAL,因为它们都是 int 类型,所以没有任何工作,g++ 抱怨。在这里使用的正确默认值是什么?

或者这种事情不是一个好主意?

4

4 回答 4

28

的正确表达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

于 2010-11-08T22:35:57.080 回答
6

您创建一个值初始化的临时对象。例如:

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

(typedef 可能有助于使代码在您的代码中更具可读性)

于 2010-11-08T22:33:28.680 回答
6

从 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上玩这个例子。

于 2017-11-09T13:32:49.663 回答
2

首先,切题的是,您通过const value传递地图,这是毫无意义的,可能不是您真正想要的。您可能希望通过const reference传递,这样您就不会复制地图,并确保您的函数不会修改地图。

现在,如果您希望您的默认参数是一个空映射,您可以通过构造它来实现,如下所示:

Foo::Foo( int arg1, int arg2, const std::map<std::string, std::string>& = std::map<std::string, std::string>())
于 2010-11-08T22:35:21.780 回答