c++ - 具有默认值的引用函数
问题描述
考虑这个函数:
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++14 则需要enable_if_t<Z>
替换为typename enable_if<Z>::type
.
推荐阅读
- angular - 不能将 href 与 routerLink 同时用作 Angular 中的条件属性
- intellij-idea - InteliJ,行号旁边的本地更改标记消失了
- android - openqa.selenium.NoSuchSessionException:会话已终止或未启动
- vue.js - Select box does not update v-model
- ffmpeg - 带有 FIFO 到 RTMP 服务器的 FFMPEG 中断播放
- javascript - GraphQL 查询的无效挂钩调用
- c# - 通用接口、实现和依赖注入 - 实现类型不能转换为服务类型
- postgresql - TypeORM双向复合主键关系
- reactjs - 为扩展面板启用复制粘贴
- python - Pygame 不抛出任何错误,但不播放任何音频