c++ - 转发成员函数参数
问题描述
解决方案
通过指向成员的指针调用成员函数仍然需要this
指针,就像在通常的(直接)调用中一样。简而言之,您可以成功A::get()
调用
static auto wrong_wrapper = &A::get;
(a.*wrong_wrapper)(2);
但是你在forward_args
实例化之后得到的是
A::get(a, 2);
这本质上不是正确的语法。
解决方案
正如评论部分已经说过的那样,如果您被允许使用 C++17,请使用std::invoke
. 如果你不是,你可以使用它来解决它std::reference_wrapper
,它接受任何可调用的类型。
template<class Function, class ... Args>
auto forward_args(Function f, Args&& ... args)
{
return std::ref(f)(std::forward<Args>(args)...);
}
我在这里不转发f
,因为std::reference_wrapper
要求传递的对象不是 rval。
升级版:
forward_args
如果您使用 C++11 ,请不要忘记指定尾随返回类型
template<class Function, class ... Args>
auto forward_args(Function f, Args&& ... args) -> decltype(std::ref(f)(std::forward<Args>(args)...))
{
return std::ref(f)(std::forward<Args>(args)...);
}
推荐阅读
- nginx - 如何让 nginx 同时处理 fastcgi 请求?
- javascript - 出于某种原因,此代码导致所有单选按钮都被预先填充为选中状态。它始终是组内的最后一个
- angular - 如何以角度绑定和更改动态组件输入?
- nginx - 每当出现 502 错误时如何让 nginx 运行脚本
- configuration - 专用集群的 Apache Ray 自动集群设置
- angular - 如何在 TypeScript 中将数字与数字相加
- string - 如何对一组数字进行字符串匹配?
- filepond - 在文件池中使用 HEIC 文件?
- swift - UICollectionView stackview 可重用单元问题
- node.js - 将参数传递给打字稿装饰器