首页 > 解决方案 > 转发成员函数参数

问题描述

标签: c++templatesvariadic-templatesperfect-forwarding

解决方案


通过指向成员的指针调用成员函数仍然需要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)...);
}

推荐阅读