4

我最初尝试了这个答案,但是在将'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 将是不返回值的函数的重载,但经过基本测试后,它可以按预期工作。

4

1 回答 1

4

你只是有一个额外的论点ExecuteWithReturn

该功能可能应该更改为

void ExecuteWithReturn(const F &_bind, T & ret)

否则你需要传递sleep你调用的参数ExecuteWithReturn

boost::thread thrd(ExecuteWithReturn<T, F>, _bind, sleep, boost::ref(ret));
于 2013-03-19T02:57:27.890 回答