我有一个带两个参数的函数。第一个参数是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进行比较,轻松检查调用者是否传入了第二个参数。但是,在参考案例中,我没有看到任何这种简单的检查。
答案 0 :(得分:4)
如果函数的实现不是太复杂,我建议创建两个重载函数。
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
块进行更新。
答案 1 :(得分:2)
如果你真的想要将临时值绑定到左值引用,可以使用辅助函数将rvalue转换为左值:
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>()))
{
}