我最初尝试了这个答案,但是在将'bind'的值分配给'int'(在这种情况下是我的函数的返回类型)时出现编译错误。我对提升相当不熟悉,但正在努力改进。有关如何使以下内容在 VC10 上编译和正常工作的任何建议?
template <class T, class F>
void ExecuteWithReturn(const F &_bind, long sleep, T & ret)
{
ret = _bind();
}
template <class T, class F>
bool TryExecuteFor(const F &_bind, long sleep, T & ret) {
boost::thread thrd(ExecuteWithReturn<T, F>, _bind, boost::ref(ret));
return thrd.timed_join(boost::posix_time::milliseconds(sleep));
}
结果是编译错误:
错误 C2198: 'void (__cdecl *)(const boost::_bi::bind_t &,long,T &)' : 调用参数太少 1> [ 1>
R=long, 1> F=long (__cdecl * )(const wchar_t *,const wchar_t *,wchar_t **), 1>
L=boost::_bi::list3,boost::_bi::value,boost::_bi::value>, 1> T=int 1 > ]
并且这个函数的用法预计是:
int ret;
if(!TryExecuteFor(boost::bind(g_pMyFunc, someParam, anotherParam), 10000, ret))
{
...
}
编辑:感谢弗雷泽指出 ExecuteWithReturn 的明显问题;结合另一个修复程序使代码工作。运行后,我意识到一个很可能的问题,如果线程是孤立的,则传入的变量(包括返回值)可能会在函数返回之前超出范围。我不能对绑定函子的参数做太多事情,但为了减轻潜在的问题,我将返回值更改为 shared_ptr。目前的工作实施如下:
template <class F>
void ExecuteWithReturn(const F &_bind, boost::shared_ptr<decltype(_bind())> _ret)
{
*_ret = _bind();
}
template <class F>
bool TryExecuteFor(const F &_bind, long _timeout, boost::shared_ptr<decltype(_bind())> _ret) {
boost::thread thrd(ExecuteWithReturn<F>, boost::ref(_bind), _ret);
return thrd.timed_join(boost::posix_time::milliseconds(_timeout));
}
nice easy TODO 将是不返回值的函数的重载,但经过基本测试后,它可以按预期工作。