std :: bind函数将std :: unique_ptr作为参数

时间:2017-05-28 09:36:19

标签: c++ binding c++14 move unique-ptr

请帮我解决我面临的约束问题......

我有一个班级成员方法:

std::unique_ptr<TopoDS_Shape> test( std::unique_ptr<TopoDS_Shape> Shape ) const
{
    std::unique_ptr<TopoDS_Shape> Result = std::make_unique<TopoDS_Shape>();
    return( std::move( Result ) );
}

我需要构建一个std::function指针。为此,我需要使用std::bind转发此指针,因为test(...)是一个类成员方法:

std::function<std::unique_ptr<TopoDS_Shape>(std::unique_ptr<TopoDS_Shape>)> tTestFunction;

tTestFunction = std::bind( &ComponentModelModifier::test, this, std::placeholders::_1 );

然后,std :: function指针在我的threadpool add方法中使用,带有以下签名:

template<typename FUNCTION, typename... ARGUMENTS>
auto ThreadPool::add( FUNCTION&& Function, ARGUMENTS&&... Arguments ) -> std::future<typename std::result_of<FUNCTION(ARGUMENTS...)>::type>

电话:

std::unique_ptr<TopoDS_Shape> tShape = std::make_unique<TopoDS_Shape>();

ThreadPool tp;
std::future<std::unique_ptr<TopoDS_Shape>> ResultFuture = tp.add( tTestFunction, std::move( tShape ) );

但构建总是失败:

error: no type named ‘type’ in ‘class std::result_of<std::reference_wrapper<std::_Bind<std::function<std::unique_ptr<TopoDS_Shape>(std::unique_ptr<TopoDS_Shape>)>(std::unique_ptr<TopoDS_Shape>)> >()>’
       typedef typename result_of<_Callable(_Args...)>::type result_type;

我知道std :: unique_ptr不是可复制构造的。这就是为什么我尝试使用std :: move但没有任何效果......

我会很高兴为正确的方向提供任何帮助或帮助。提前致谢!马丁

1 个答案:

答案 0 :(得分:0)

我的线程池的add()方法似乎没有成功推断出参数类型,因此会报告上面显示的错误消息。我试着在函数调用中更具体 - 特别是在我std::move中我试图指定结果类型。此外,我需要修改test()方法签名以使用共享指针(请参阅参数类型)。请参阅下面的代码:

std::unique_ptr<TopoDS_Shape> test( const std::shared_ptr<TopoDS_Shape> Shape ) const
{
    std::unique_ptr<TopoDS_Shape> Result = std::make_unique<TopoDS_Shape>();
    return( std::move( Result ) );
}

...

std::future<std::unique_ptr<TopoDS_Shape>> ResultFuture = tp.add( tTestFunction, std::move<std::shared_ptr<TopoDS_Shape>>( tShape ) );

然后我能够编译代码......目前还不清楚为什么std::unique_ptr不能用作test()方法参数类型,但至少我有一个有效的解决方案。 也许它与std :: function的使用有关,它必须具有所有参数copy-constructible,而不是std::unique_ptr的情况。我不知道如何在这里调用移动构造函数而不是删除复制一个。 如果有人有想法,请发帖。