diff options
Diffstat (limited to 'base/stl_helpers.hpp')
-rw-r--r-- | base/stl_helpers.hpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/base/stl_helpers.hpp b/base/stl_helpers.hpp index 2130dd03d7..5ee22b6897 100644 --- a/base/stl_helpers.hpp +++ b/base/stl_helpers.hpp @@ -2,6 +2,7 @@ #include <algorithm> #include <functional> +#include <type_traits> #include <utility> #include <vector> @@ -137,4 +138,29 @@ typename std::underlying_type<T>::type Key(T value) { return static_cast<typename std::underlying_type<T>::type>(value); } + +// Use this if you want to make a functor whose first +// argument is ignored and the rest are forwarded to |fn|. +template <typename Fn> +class IgnoreFirstArgument +{ +public: + template <typename Gn> + IgnoreFirstArgument(Gn && gn) : m_fn(std::forward<Gn>(gn)) {} + + template <typename Arg, typename... Args> + typename std::result_of<Fn(Args &&...)>::type operator()(Arg && arg, Args &&... args) + { + return m_fn(std::forward<Args>(args)...); + } + +private: + Fn m_fn; +}; + +template <typename Fn> +IgnoreFirstArgument<Fn> MakeIgnoreFirstArgument(Fn && fn) +{ + return IgnoreFirstArgument<Fn>(std::forward<Fn>(fn)); +} } // namespace my |