Vergleich Klassentemplate mit Variadics

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
snoob741
Beiträge: 76
Registriert: 03.04.2012, 22:36

Vergleich Klassentemplate mit Variadics

Beitrag von snoob741 »

Zur Realisierung von Factory-Delegates nutze ich folgendes Klassentemplate:

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 ;
};
Das klappt soweit hervorragend und ermöglicht es mir die Delegates typenabhängig in einem STL Container zu speichern. Nun möchte ich gern die Delegates vergleichen. Dafür wollte ich lediglich die Funktoren miteinander vergleichen. Allerdings finde ich keinen vernünftigen Ansatz das zu Realisieren, da ich das brDelegate typenunabhängig habe und ich in den konkreten Typ casten muss.

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?
snoob741
Beiträge: 76
Registriert: 03.04.2012, 22:36

Re: Vergleich Klassentemplate mit Variadics

Beitrag von snoob741 »

Konnte das Problem selbst lösen. Hab einfach nur zu kompliziert gedacht. Muss ja nur die Signatur vom gesamten Delegate vergleichen:

Code: Alles auswählen

virtual bool operator== ( const brDelegate& other ) const {			
          return typeid(*this) == typeid(other) ; 
}
Antworten