Vergleich Klassentemplate mit Variadics
Verfasst: 07.10.2014, 16:09
Zur Realisierung von Factory-Delegates nutze ich folgendes Klassentemplate:
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?
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?