【问题标题】:Optionally taking a function variable as a parameter可选择将函数变量作为参数
【发布时间】:2014-03-27 21:04:22
【问题描述】:

我有两个函数做几乎相同的事情,唯一的区别是一个实例化它的一个变量,而另一个将它作为参数:

void f1()
{
    myType o;
    // do work on o
}

void f2(shared_ptr<myType> o)
{
    // do work on o
}

这是因为有些调用者在工作完成后需要 o,而有些则不需要。已经完成了很多工作,现在保持功能同步是复制粘贴的事情(也将“o.”更改为“o->”)。是否可以将这些组合成一个函数,这样如果调用者传入一个 o,那么使用它(如在 f2 中),否则构造一个(如在 f1 中)?也许通过在签名中设置默认值?

【问题讨论】:

  • 可能是void f2(shared_ptr&lt;myType&gt; = nullptr)?
  • @0x499602D2 我得到一个错误,“重新定义默认参数”。
  • @fatcat1111 你应该只在函数声明中指定默认参数,而不是定义。否则你会得到你引用的错误。

标签: c++ c++11 parameters default


【解决方案1】:

std::make_shared 函数与默认参数结合使用:

void f2 (shared_ptr<myType> o = make_shared<myType>())

【讨论】:

  • 能否将其推广到支持需要一些指针操作的参数,例如“f(shared_ptr& o)”?
  • 对于具有默认参数的引用,您需要一个相同类型的全局变量,即全局范围内有一个shared_ptr&lt;myType&gt; g = std::make_shared&lt;myType&gt;();,然后是void f (std::shared_ptr&lt;int&gt; &amp; o = g)。你具体想做什么?
  • 您的回答达到了我的具体目标。我只是在思考这个问题,试图绕过默认设置。
【解决方案2】:

第一个函数可以通过使用std::shared_ptrnull 删除器转发到第二个函数:

struct null_deleter
{
    template <typename T>
    void operator()(T*) { }
};

void f1()
{
    myType o;
    f2(std::shared_ptr<myType>(&o, null_deleter{}));
}

【讨论】:

    【解决方案3】:

    简单地重载函数:

    void f1() // void seems odd, wouldn't you return o after you've done work on it?
    {
        yourType o;
        // do work on o
    }
    void f1(yourType& o)
    {
        // do work on o
    }
    

    【讨论】:

    • 我希望只有一个函数,这样我就不必在 f1 和 f2(或 f1 和 f1)之间重复代码。顺便说一句,在这些函数中所做的工作都是副作用。这是一个非常不实用的设计。
    • 从第一个开始调用第二个,把所有的逻辑放在带参数的函数中。
    猜你喜欢
    • 2020-09-13
    • 2014-03-08
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多