std::forward以转发函数



我有以下代码没有编译,特别是在通过std::forward 转发之后

struct TestParent
{
template< typename Fn >
bool test( Fn&& fn )
{
//.. do something
//.. check some condition
bool someCondition = true;
if ( someCondition )
{
//this call works!
return fn();
}
return testAtNextLevel( std::forward< Fn >( fn ) );
}
template < typename Fn >
bool testAtNextLevel( Fn&& fn )
{
if ( (this->*fn() )
{
return true;
}
//... test some more
return true;
}
}
struct TestChild: public TestParent
{
bool thisTestOk();
bool testAll();
}
bool TestChild::thisTestOk()
{
return true;
}
bool testAll()
{
auto myFunc = std::bind( &TestChild::thisTestOk, this );
return test( myFunc );
}

编译时,我收到了以下错误消息:

error: no match for 'operator->*' (operand types are 'TestParent*' and 'std::_Bind<std::_Mem_fn<bool (TestChild::*)()>(TestChild*)>')
if ( (this->*fn)() )

有人知道为什么在经历了std::forward之后,函数就不能被调用了吗?在基类中,就在调用"testAtNextLevel"之前,如果满足某些条件,我们可以直接调用传入的函数,但不能在它被转发到另一个模板函数之后调用?

使用所有这些模板和auto声明,很容易忘记要处理的数据类型。让我们从代码底部开始:

auto myFunc = std::bind( &TestChild::thisTestOk, this );

什么是myFunc?虽然std::bind的返回类型是官方未指定的,但它的使用是指定的(例如,请参阅cppreference.com(。将此返回值作为函数调用相当于将thisTestOk()的唯一参数绑定到this

也就是说,指向-TestChild参数的隐藏指针(存在于TestChild的所有非静态成员函数中(已被this替换,CCD_8具有将成员函数转换为非成员函数的效果。现在让我们看看如何调用这个包装器非成员函数。

test()中,这个包装器是通过return fn()调用的。它被作为一个函数调用,并按预期工作。

testAtNextLevel()中,这个包装器是通过this->*fn()调用的。此包装器非成员函数被调用为指向成员函数的指针,这是一个错误。为了使其在语法上工作,调用应该简单地为fn(),就像在test()中一样。如果您真的想覆盖绑定对象并使用this作为fn()的隐藏参数,则需要将不同的东西作为参数传递给testAtNextLevel(),可能是指向成员的指针(它必须是指向-TestParent-member的指针,而不是指向-CCD-19-member的指针(。

相关内容

  • 没有找到相关文章

最新更新