Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
#pragma once
// Begin ecatmur's code
//http://stackoverflow.com/questions/13358672/how-to-convert-a-lambda-to-an-stdfunction-using-templates/13359520#13359520
template<typename T> struct remove_class { };
template<typename C, typename R, typename... A>
struct remove_class<R(C::*)(A...)> { using type = R(A...); };
template<typename C, typename R, typename... A>
struct remove_class<R(C::*)(A...) const> { using type = R(A...); };
template<typename C, typename R, typename... A>
struct remove_class<R(C::*)(A...) volatile> { using type = R(A...); };
template<typename C, typename R, typename... A>
struct remove_class<R(C::*)(A...) const volatile> { using type = R(A...); };
template<typename T>
struct get_signature_impl { using type = typename remove_class<
decltype(&std::remove_reference<T>::type::operator())>::type; };
template<typename R, typename... A>
struct get_signature_impl<R(A...)> { using type = R(A...); };
template<typename R, typename... A>
struct get_signature_impl<R(&)(A...)> { using type = R(A...); };
template<typename R, typename... A>
struct get_signature_impl<R(*)(A...)> { using type = R(A...); };
template<typename T> using get_signature = typename get_signature_impl<T>::type;
// End ecatmur's code
// Begin typecase code . .......................................................
template< typename Base, typename FirstSubclass, typename... RestOfSubclasses >
void typecase(
Base& base,
FirstSubclass &&first,
RestOfSubclasses &&... rest )
{
using Signature = get_signature<FirstSubclass>;
using Function = std::function<Signature>;
if( typecaseHelper( base, (Function)first ) )
return;
else
typecase( base, rest... );
}
// .............................................................................
template<typename Base>
void typecase( Base& )
{
;//assert(false);
//some kinda warning????
}
// .............................................................................
template<typename Base, typename T>
bool typecaseHelper( Base& base, std::function<void( T& )> func )
{
T* first= dynamic_cast< T* >( &base );
if( first )
{
func( *first );
return true;
}
else
{
return false;
}
}
// End typecase code
9089253afThis file is pinned to the selected release. Download the original to open it in your design tool.