请帮我解决我面临的约束问题......
我有一个班级成员方法:
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但没有任何效果......
我会很高兴为正确的方向提供任何帮助或帮助。提前致谢!马丁
答案 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
的情况。我不知道如何在这里调用移动构造函数而不是删除复制一个。
如果有人有想法,请发帖。