根据函数签名将引用作为左值/右值传递
Passing reference as lvalue/rvalue depending on function signature
假设我有一些数据:
struct Bar {};
我需要包装一个函数,并用这些数据提供给它。
template<typename F>
void foo(F f) {
Bar bar;
f(bar);
}
正如您在这个琐碎的例子中看到的:
bar
不是临时的- 我打电话给
f
后就不需要了
我想支持多功能签名,例如:
foo([](Bar){}); // (1)
foo([](Bar&){}); // (2)
foo([](Bar&&){}); // (3)
然而,gcc抱怨道:
f(bar); // (3) : cannot bind 'Bar' lvalue to 'Bar&&'
f(std::move(bar)); // (2) : no match for call to ...
你会怎么做到这两个?
struct BarIsh{
Bar&b;
operator Bar&&()&&{return std::move(b);}
operator Bar&()&&{return b;}
};
然后是CCD_ 3。
缺点是,如果f
取一个推导的参数,它得到的是BarIsh
,而不是Bar
。
假设你有一个SFINAE友好的result_of
。。。
template<class...>struct voider{using type=void;};
template<class...Ts>using void_t=typename voider<Ts...>::type;
template<class...>struct types{using type=types;};
namespace details{
template<template<class...>class Z,class types,class=void>
struct can_apply:std::false_type{};
template<template<class...>class Z,class...Ts>
struct can_apply<Z,types<Ts...>,void_t<Z<Ts...>>>:
std::true_type
{};
};
template<template<class...>class Z,class...Ts>
using can_apply=details::can_apply<Z,types<Ts...>>;
template<class Sig>
using result_of_t=typename std::result_of<Sig>::type;
template<class Sig>
using can_invoke=can_apply<result_of_t,Sig>;
现在我们可以测试了。
template<typename F>
void foo(F&& f,std::true_type)
{
Bar bar;
std::forward<F>(f)(std::move(bar));
}
template<typename F>
void foo(F&& f,std::false_type)
{
Bar bar;
std::forward<F>(f)(bar);
}
template<typename F>
void foo(F f)
{
foo(std::forward<F>(f),can_apply<F(Bar&&)>{});
}
并完成。(上面可能有打字错误,代码写在手机上)
相关文章:
- 如何用参数值调用函数(仅在运行时已知)
- 为什么可以将左值传递给"std::async",即使它引用了右值
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 是否有原子加载非原子值的函数?
- 使用基类指针调用基类的值构造函数的语法是什么?
- 编写以 C++ 为单位返回值的函数
- VkSurfaceKHR 指针的值在函数调用后更改,无需任何显式赋值
- 无法将右值引用函数与 GCC 匹配
- 在对象数组中搜索字符串并返回相应值的函数
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- 当值传递给C++中的运算符重载函数时会发生什么
- C++,如何将返回值的函数传递给 func
- 如何将值传递给 lambda 函数
- 如何将值传递给MFC消息映射函数on_command
- 如何将函数中的多个值传递给C++中的不同函数
- 将多个解析值传递给 addPositionalArgument 函数
- C++为什么将左值传递给move构造函数对模板有效
- 一种自动检测对象的方法,该方法通过值传递给c++中的函数
- 试图将整型转换为void以按值传递给pthread函数