我正在玩元组和模板。我知道如果练习你会使用 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;
}