繁体   English   中英

函数引用参数的默认值

[英]Default value for a reference parameter to a function

我有一个带有两个参数的函数。 第一个参数是int&,该函数将设置为某个“返回”值。 第二个参数是一个指针,并且是可选的。 如果调用方希望对其进行初始化,则调用方可以传递一个有效的指针,否则,默认值为nullptr。

void find_lis(uint32_t& count,
              vector<uint32_t>* output = nullptr)
{ }

一切都很好。 但是,我想将第二个参数作为引用,并允许调用者使用相同的选项来提供或不提供一个,我应该使用什么作为默认值?

void find_lis(uint32_t& count,
              vector<uint32_t>& output = ???)
{ }

我尝试了一些方法,但是它们会导致编译器错误。 但是,以下至少可以编译,但是我不确定是否正确?

void find_lis(uint32_t& count,
              vector<uint32_t>& output = *(new vector<uint32_t>()))
{ }

在指针的情况下,我可以通过将值与nullptr进行比较来轻松检查调用方是否传入了第二个参数。 但是,在参考案例中,我看不到任何这种简单的检查。

如果函数的实现不是太复杂,我建议创建两个重载函数。

void find_lis(uint32_t& count)
{
   count = 0; // ???
}

void find_lis(uint32_t& count,
              vector<uint32_t>& output)
{
   // Proper implementation
}

另外一个选项:

void find_lis(uint32_t& count)
{
   // I'm guessing this will work. May be not.
   static vector<uint32_t> dummy;
   find_lis(count, dummy);
}

void find_lis(uint32_t& count,
              vector<uint32_t>& output)
{
   // Proper implementation
}

更新,以回应OP的评论

采用:

void find_lis_private(uint32_t& count,
                      vector<uint32_t>& output,
                      bool update)
{
   // Proper implementation
}

void find_lis(uint32_t& count)
{
   static vector<uint32_t> dummy;
   find_lis_private(count, dummy, false);
}

void find_lis(uint32_t& count,
              vector<uint32_t>& output)
{
   find_lis_private(count, output, true);
}

更好的选择是使用:

template <typename UpdateFunction>
void find_lis_private(uint32_t& count,
                      vector<uint32_t>& output,
                      UpdateFunction fun)
{
   // Proper implementation
   // call fun() with the necessary arguments when it's time
   // to update.
}

void find_lis(uint32_t& count)
{
   static vector<uint32_t> dummy;
   find_lis_private(count, dummy, [](args...) {/* Empty function */});
}

void find_lis(uint32_t& count,
              vector<uint32_t>& output)
{
   find_lis_private(count, output, [=output](args...) {/* Update output */});
}

然后,您不必使用if / else块进行更新。

如果您确实想将临时绑定到左值引用,则可以使用辅助函数将右值转换为左值:

template <class T>
T& lvalue_cast(T&& t)
{
    return t;
}

void find_lis(uint32_t& count,
              std::vector<uint32_t>& output = lvalue_cast(std::vector<uint32_t>()))
{
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM