具有默认值的引用获取函数

A reference taking function with a default value

本文关键字:获取 函数 引用 默认值      更新时间:2023-10-16

考虑这个函数:

void func(int* a = nullptr)
{
if (a)
*a = 1;
}

然后,我可以在没有参数的情况下调用函数,因为它具有默认值(func()(,或者我可以通过参数(func(somePtr)(获得一个值。现在,我试图弄清楚,在不使用引用重载方法的情况下,是否可以实现相同的功能。我得到的最接近的东西是使用通用引用,但在这种情况下,我必须使用模板类型,在我的情况下,类型是严格的。有没有办法将这种裸指针功能转换为引用功能?

我想出的一种方法是:

void func(int& a)
{
a = 5;
}
void func()
{
int dummy;
fund(dummy);
}

我的目标是这样的(行不通(:

template<typename T>
void func(T&& a = int())
{
a = 1;
}

过载是最自然的方式,例如

void func(int&  a)  {  a = 1; /* assume some other complex logic here */ }
void func(int&& a = int())  { func(a); }

有可能使SFINAE版本发挥作用,尽管我相信美学观点会有所不同:

#include <type_traits>
template<typename T, typename U>
using EnableIfSame = std::enable_if_t<std::is_same_v<std::remove_reference_t<T>, U>>;
template<typename T = int, typename = EnableIfSame<T, int>>
void func(T&& a = int())
{
a = 1;
}

如果没有C++17,则需要将is_same_v<Z>替换为is_same<Z>::value,如果没有C++15,则需要用typename enable_if<Z>::type替换enable_if_t<Z>

我不确定我能不能解决你的问题。也许这个方法可以回答你的问题。

void *p;
template <typename T>
void func(T def, T& t = *(T *)p)
{
if (&t != p)
t = def;
}
int main()
{
int a;
func(1);
func(1, a);
}