具有默认值的引用获取函数
A reference taking function with a default value
考虑这个函数:
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);
}
相关文章:
- 具有默认值的引用获取函数
- 如何从"decltype()"获取函数参数的数量<funtion>?
- C++ 获取函数在常量引用中按值返回的结果
- 如何从参数中获取函数签名?
- 获取函数的地址?
- 如何从不同的类中获取函数来调用在 Main 中声明的对象?
- 在 gcc/clang (C++) 中获取函数范围之外的标签地址
- 如何使用 std::invoke_result_t 获取函数的返回类型
- 获取函数中基元类型的指针
- 如何从 lambda 表达式中获取函数指针?
- 如何从核密度估计中获取函数?
- 如何在函数内部使用 zmq(以非阻塞方式)在客户端请求时获取函数的状态?
- 具有获取函数的无限循环
- 使用 decltype(this) 获取函数引用
- 在编译时使用可变参数模板在 c++ 中使用参数类型检查获取函数的参数数
- 如何在C++中接收任何类型的函数参数并获取函数内传递变量的类型?
- 从C 中的PHP扩展中获取函数参数值
- 从返回绑定中获取函数失败
- 从 Rcpp c++ 函数获取 r 函数参数
- 获取函数调用方的地址?