diff --git a/include/Nazara/Core/Algorithm.hpp b/include/Nazara/Core/Algorithm.hpp index 7fc8b34b7..462175307 100644 --- a/include/Nazara/Core/Algorithm.hpp +++ b/include/Nazara/Core/Algorithm.hpp @@ -12,6 +12,7 @@ #include template auto NzApply(F&& fn, Tuple&& t); +template auto NzApply(O& object, F&& fn, Tuple&& t); template void NzHashCombine(std::size_t& seed, const T& v); template diff --git a/include/Nazara/Core/Algorithm.inl b/include/Nazara/Core/Algorithm.inl index fb393fcf9..859dbb8d9 100644 --- a/include/Nazara/Core/Algorithm.inl +++ b/include/Nazara/Core/Algorithm.inl @@ -9,8 +9,8 @@ #include // http://www.cppsamples.com/common-tasks/apply-tuple-to-function.html -template -auto NzApplyImpl(F&& fn, Tuple&& t, std::index_sequence) +template +auto NzApplyImplFunc(F&& fn, Tuple&& t, std::index_sequence) { return std::forward(fn)(std::get(std::forward(t))...); } @@ -18,11 +18,24 @@ auto NzApplyImpl(F&& fn, Tuple&& t, std::index_sequence) template auto NzApply(F&& fn, Tuple&& t) { - std::size_t constexpr tSize = std::tuple_size::type>::value; + constexpr std::size_t tSize = std::tuple_size::type>::value; - return NzApplyImpl(std::forward(fn), std::forward(t), std::make_index_sequence()); + return NzApplyImplFunc(std::forward(fn), std::forward(t), std::make_index_sequence()); } +template +auto NzApplyImplMethod(O& object, F&& fn, Tuple&& t, std::index_sequence) +{ + return (object .* std::forward(fn))(std::get(std::forward(t))...); +} + +template +auto NzApply(O& object, F&& fn, Tuple&& t) +{ + constexpr std::size_t tSize = std::tuple_size::type>::value; + + return NzApplyImplMethod(object, std::forward(fn), std::forward(t), std::make_index_sequence()); +} // Algorithme venant de CityHash par Google // http://stackoverflow.com/questions/8513911/how-to-create-a-good-hash-combine-with-64-bit-output-inspired-by-boosthash-co template