Skip to content

Instantly share code, notes, and snippets.

@dolinenkov
Created September 17, 2018 11:17
Show Gist options
  • Select an option

  • Save dolinenkov/07273afa6269e79b9d9aa180e52eb70d to your computer and use it in GitHub Desktop.

Select an option

Save dolinenkov/07273afa6269e79b9d9aa180e52eb70d to your computer and use it in GitHub Desktop.
Implementation of a C++17 feature - `std::apply` - in C++11 standard
/*
Implementation of a C++17 feature - `std::apply` - in C++11 standard
*/
#ifndef FUTURE_APPLY_HH
#define FUTURE_APPLY_HH
#include <tuple>
#include <utility>
#include <type_traits>
namespace future
{
template<size_t...>
struct IndexSequence
{
};
template<size_t... integers>
struct _MakeIndexSequence;
template<size_t counter, size_t... integers>
struct _MakeIndexSequence<counter, integers...>
{
using Type = typename _MakeIndexSequence<counter - 1, counter - 1, integers...>::Type;
};
template<size_t... integers>
struct _MakeIndexSequence<0, integers...>
{
using Type = IndexSequence<integers...>;
};
template<typename Tuple>
struct _IndexSequenceForTuple
{
using Type = typename _MakeIndexSequence<std::tuple_size<typename std::remove_reference<Tuple>::type>::value>::Type;
};
template<typename Tuple>
using IndexSequenceForTuple = typename _IndexSequenceForTuple<Tuple>::Type;
template<typename Function, typename Tuple, size_t... Index>
auto _Apply(Function && function, Tuple && tuple, IndexSequence<Index...>) -> decltype(function(std::get<Index>(std::forward<Tuple>(tuple))...))
{
return std::forward<Function>(function)(std::get<Index>(std::forward<Tuple>(tuple))...);
}
template<typename Function, typename Tuple>
auto Apply(Function && function, Tuple && tuple) -> decltype(_Apply(std::forward<Function>(function), std::forward<Tuple>(tuple), IndexSequenceForTuple<Tuple>()))
{
return _Apply(std::forward<Function>(function), std::forward<Tuple>(tuple), IndexSequenceForTuple<Tuple>());
}
}
#endif // FUTURE_APPLY_HH
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment