gpt4 book ai didi

c++ - 函数引用参数的默认值

转载 作者:搜寻专家 更新时间:2023-10-31 00:12:01 24 4
gpt4 key购买 nike

我有一个带有两个参数的函数。第一个参数是一个 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 block 来更新。

关于c++ - 函数引用参数的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31824516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com