【问题标题】:Default construction for default parameters默认参数的默认构造
【发布时间】:2016-01-06 15:06:20
【问题描述】:

前提:我很懒。而且我不喜欢排长队。

假设您有一个带有一个参数的函数,并且您想为该参数指定一个默认值。假设参数是std::map,默认只是一个空映射。这样做的方法是

void foo (std::map<Key,Value> the_map = std::map<Key,Value>());

现在,如果 Key 和/或 Value 的名称很长(可能是模板化的),函数声明就会变长。有办法写出类似的东西会很好

void foo (std::map<Key,Value> the_map = auto);

现在,我知道这不是使用关键字auto,而只是为了解释这个概念:我不想仅仅因为必须写下一个已经很长的函数声明的长度加倍简单的默认构造的默认元素。我只想告诉编译器“看,在那里构建一个默认的”。有没有办法做到这一点?另外,有没有人也觉得有这个需求?

注意:是的,我可以 typedef 地图类型并使用短名称。但我想要一种不同的方式。 注 2:是的,我也可以重载该函数,以便它的一个版本不带参数,而另一个版本不带参数。但我想要一种不同的方式。

我想我正在寻找的是“默认默认参数”...

【问题讨论】:

    标签: c++ function default-value


    【解决方案1】:

    您可以将{} 用作initializer-clause,这将对参数进行值初始化。

    void foo(std::map<K, V> the_map = {});
    

    【讨论】:

    • 我认为 OP 将地图放在那里仅作为示例,地图特别具有此解决方案的事实并不能使其成为一般答案
    • @Slava 你能举个例子说明这不起作用吗?
    • 嗯似乎我错了,它适用于任何具有默认 ctor 的类。当锁定消失时我会 +1 你的答案(如果答案没有改变,我不能改变我的投票是愚蠢的)
    • 是的!这就是我一直在寻找的。我试过了,它有效。但它看起来在显式默认构造函数的情况下会失败。我想在那种情况下没有办法,呃?
    • @bartgol 我不确定。在标准的当前措辞中,当默认构造函数是显式的时,这实际上确实有效。但是,有一个关于这个问题的缺陷报告(我真的不明白发生了什么)。如果您想要一个明确的答案,请发布到标准讨论邮件列表。 open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1518
    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2016-06-05
    • 2010-12-10
    • 2014-05-18
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多