Skip to content

Instantly share code, notes, and snippets.

@robertshepherdcpp
Created December 17, 2022 17:38
Show Gist options
  • Save robertshepherdcpp/e43926ff520063ba7894485bcdbdd737 to your computer and use it in GitHub Desktop.
Save robertshepherdcpp/e43926ff520063ba7894485bcdbdd737 to your computer and use it in GitHub Desktop.
A cool new idiom for a decreasing tuple
template<typename T, typename... Ts>
struct Tuple
{
T first;
Tuple<Ts...> second{};
bool first_removed = false;
auto remove_first()
{
if(first_removed == false)
{
first_removed = true;
}
else
{
second.remove_first();
}
}
template<auto T>
auto get()
{
if constexpr(T == 0 && first_removed == false)
{
return first;
}
else if constexpr(T == 0 && first_removed == true)
{
return second.get<T>();
}
else
{
return second.get<T - 1>();
}
}
};
template<typename T>
struct Tuple<T>
{
T first;
bool first_removed = false;
auto remove_first()
{
first_removed = true;
}
template<auto T>
auto get()
{
if(T == 0 && first_removed == false)
{
return first;
}
else
{
// can't do anything, the user has entered in wrong input.
}
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment