Ich würde das "Typ-Traits" -Konzept hier verwenden.
Dies hat den Vorteil, dass es eine Kompilierzeitlösung ist (keine Laufzeitfehler aufgrund fehlender typspezifischer Codes), und Sie müssen die inputPort_varExp-Klasse nicht für jeden Typ bearbeiten, den Sie als a_type übergeben.
Die Idee ist, erstellen Sie eine Vorlage Klasse/Struktur einem Typ zum anderen zur Karte: -
template< typename t >
class DerivativeTrait
{
public:
typedef DerivativeType t;
//this provides a default derivate...
//you'd need to decide if that was a safe thing to do
};
Sie dann diese Eigenschaft Klasse spezialisieren können: -
template<>
class DerivativeTrait<Frame>
{
public:
typedef DerivativeType Twist;
};
Sie können nun diese verwenden
typedef DerivativeTrait<a_type>::DerivativeType a_type_der;
Note seit C++ 11 Sie die usi nutzen könnten -: in Ihre inputPort_varExp a_type_der definieren ng keyword anstelle von typedef.
Einige andere Optionen:
Wenn Sie die Typen, die Sie zu inputPort_varExp passieren in bearbeiten in der Lage sind, können Sie nur eine typedef zu diesen Klassen hinzufügen - dies würde für Ihren Fall nicht funktionieren, da Sie doppelt in so passieren eine Art.
Eine weitere einfache Alternative besteht darin, einen zusätzlichen Vorlagenparameter für a_type_der hinzuzufügen, der jedoch eine falsche Kombination nicht verhindert (z. B. Frame und double).
Sie könnten auch declltype in Betracht ziehen, wenn der Typ vom Compiler abgeleitet werden kann.
http://www.drdobbs.com/cpp/c-type-traits/184404270 – ROX