首页 > 解决方案 > 具有默认值的引用函数

问题描述

考虑这个函数:

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;
}

标签: c++

解决方案


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

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++14 则需要enable_if_t<Z>替换为typename enable_if<Z>::type.


推荐阅读