我正在玩元組和模板。我知道如果練習你會使用boost :: fusion(我認爲)來做這種事情。我試圖通過一個元組來實現相當於std :: accumulate。積累在值的元組
下面是我的代碼。就在我可以告訴編譯錯誤是由它嘗試使用4模板參數版本引起的,當我打算使用3模板參數版本來完成遞歸時。這意味着我錯過了某些功能重載解決方案。
我曾經想過,因爲兩個函數都可以匹配,所以它會選擇3個模板參數版本作爲更好的匹配,因爲最後一個參數類型是明確聲明的。如果我將std :: tuple_size作爲附加模板參數添加到tuple_accumulate_helper的兩個版本,我仍然會得到相同的行爲。
任何人都可以建議我做錯了什麼?
#include <tuple>
template <std::size_t I>
struct int_{};
template <typename T, typename OutT, typename OpT, std::size_t IndexI>
auto tuple_accumulate_helper(T tuple, OutT init, OpT op, int_<IndexI>) -> decltype(tuple_accumulate_helper(tuple, op(init, std::get<IndexI>(tuple)), op, int_<IndexI + 1>()))
{
return tuple_accumulate_helper(tuple, op(init, std::get<IndexI>(tuple)), op, int_<IndexI + 1>());
}
template <typename T, typename OutT, typename OpT>
auto tuple_accumulate_helper(T tuple, OutT init, OpT op, int_<std::tuple_size<T>::value>) -> decltype(init)
{
return init;
}
template <typename T, typename OutT, typename OpT>
auto tuple_accumulate(T tuple, OutT init, OpT op) -> decltype(tuple_accumulate_helper(tuple, init, op, int_<0>()))
{
return tuple_accumulate_helper(tuple, init, op, int_<0>());
}
struct functor
{
template <typename T1, typename T2>
auto operator()(T1 t1, T2 t2) -> decltype(t1 + t2)
{
return t1 + t2;
}
};
int main(int argc, const char* argv[])
{
auto val = tuple_accumulate(std::make_tuple(5, 3.2, 7, 6.4f), 0, functor());
return 0;
}
VS是落後的合規性。使用在線編譯器(例如http://coliru.stacked-crooked.com/或http://ideone.com)獲取來自多個最新編譯器安裝的意見。根據Clang的說法,你有一個索引溢出錯誤,使用索引= 4到一個大小爲4的元組中。VC說什麼? – Potatoswatter
你的代碼看起來很好,除了int_ :: value>應該是int_ :: value-1>。它沒有在gcc4.8.1上編譯。它適用於msvc2013 v120。 –
通過clang運行它看起來,當我期待它選擇帶有3個模板參數的重載時,它選擇帶有4個模板參數的重載,然後無法實例化元組末尾的std :: get。 – Graznarak