Skip to content

Instantly share code, notes, and snippets.

@glaebhoerl
Created November 29, 2014 16:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save glaebhoerl/056051916220a099eb4d to your computer and use it in GitHub Desktop.
Save glaebhoerl/056051916220a099eb4d to your computer and use it in GitHub Desktop.
Fn, FnMut, FnOnce hierarchy in C++
template<typename Return, typename... Arguments>
struct FnOnce
{
using This = FnOnce<Return, Arguments...>;
virtual Return operator ()(Arguments&&...) && = 0;
};
template<typename Return, typename... Arguments>
struct FnMut: FnOnce<Return, Arguments...>
{
using This = FnMut<Return, Arguments...>;
virtual Return operator ()(Arguments&&...) & = 0;
Return operator ()(Arguments&&... arguments) && final override
{
return ((This&)(*this))(std::forward<Arguments>(arguments)...);
}
};
template<typename Return, typename... Arguments>
struct Fn: FnMut<Return, Arguments...>
{
using This = Fn<Return, Arguments...>;
virtual Return operator ()(Arguments&&...) const & = 0;
Return operator ()(Arguments&&... arguments) & final override
{
return ((This const&)(*this))(std::forward<Arguments>(arguments)...);
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment