我想使下面的代碼片段工作遞歸模板類型
typedef boost::function<result_type()> functor_type;
typedef boost::variant<int, functor_type> result_type;
兩種互相依賴,如何打破循環依賴?
的動機
基本上,我想要實現在C++中尾調用,這樣
template<typename ResultT>
struct TailCall
{
typedef ResultT result_type;
typedef boost::function<ret_type()> continuation_type;
typedef boost::variant<result_type, continuation_type> ret_type;
TailCall(const continuation_type& init) : next(init) {}
result_type operator()()
{
while (true) {
ret_type r = next();
result_type *result = boost::get<result_type>(&r);
if (result)
return *result;
else
next = boost::get<continuation_type>(r);
}
}
private:
continuation_type next;
};
TailCall<int>::ret_type fibonacci_impl(int term, int val, int prev)
{
if (term == 0) return prev;
if (term == 1) return val;
return boost::bind(fibonacci_impl, term-1, val+prev, val);
}
int fibonacci(int index)
{
TailCall<int> fib(boost::bind(fibonacci_impl, index, 1, 0));
return fib();
}
爲什麼你需要嗎? –
恐怕不可能做到這一點:( – Pubby
如果你解釋(通過編輯問題)你正在嘗試做什麼,以及你將如何使用這些typedef類型,它可能會有所幫助。 – hyde