可选择将函数变量作为参数

时间:2014-03-27 21:04:22

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

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

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

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

这是因为有些呼叫者在完成工作后需要o,而有些则不需要。有很多工作要做,现在保持功能同步是一个复制粘贴事件(也改变“o。”到“o-&gt;”)。是否有可能将这些组合成一个单独的函数,这样如果调用者传入一个o,那么就使用它(如f2),否则构造一个(如f1中所示)?也许通过在签名中设置默认值?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

第一个函数可以使用std::shared_ptr null删除器转发到第二个函数:

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

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

答案 2 :(得分:0)

简单地重载功能:

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
}