Code: Alles auswählen
// Predefine template delegate factory
template < typename R, typename... Args >
class brGenericDelegate ;
// C++11 template alias to announce functor definition
template < typename R, typename... Args >
using brGenericDelegateType = std::function< std::shared_ptr<R>(Args...) > ;
class brDelegate
{
protected:
brDelegate(){}
public:
virtual ~brDelegate() = default ;
template < typename R, typename... Args >
static std::shared_ptr<brDelegate> create( typename brGenericDelegate<R,Args...>::functor func )
{
return std::make_shared<brGenericDelegate<R,Args...>>(func) ;
}
template < typename R, typename... Args >
std::shared_ptr<R> run( Args... args ) const
{
using derived_type = brGenericDelegate<R,Args...> ;
return dynamic_cast< const derived_type& >(*this)(args...) ;
}
};
template < typename R, typename... Args >
class brGenericDelegate : public brDelegate
{
public:
using functor = brGenericDelegateType< R, Args... >;
brGenericDelegate( functor f ) : fn(f) {}
std::shared_ptr<R> operator() ( Args... args ) const { return fn(args...) ; }
private:
const functor fn ;
};
Ein Gedanke war eine Template basierte equals Methode anzubieten, die dann entsprechend den Vergleichswert und die aktuelle Implementation auf den konkreten Typen castet. Wenn der cast fehlschlägt, passen zumindest die Typen schon mal nicht. Nur bekomme ich den cast ohne forwarding der Argumente auch nicht geregelt, die wollte ich gern weg lassen. Irgendwie hab ich grade ein Knoten im Kopf :(
Sieht jemand von Euch eine Möglichkeit, möglichst elegant hier einen Vergleich zu ermöglichen?