2016-04-22 80 views
0

模板類中扣除一個I類有以下問題: 我有一個類中,我需要確定在模板類的功能的物體的類型:從模板C++

template<class a_type> class inputPort_varExp{ 
protected: 
RTT::InputPort<a_type> inport; 
RTT::InputPort<a_type_der> inport_derivative; 
... 

在我的情況下,我想用下面的邏輯自動扣除a_type_der:

  • 如果typeid的(a_type)== typeid的(幀)然後typeid的(a_type_der)= typeid的(扭轉),

  • 如果typeid的(a_type)== typeid的(雙)然後typeid的(a_type_der)= typeid的(雙),

感謝。

回答

1

我會在這裏使用「類型特徵」的概念。

這是一個編譯時解決方案(由於缺少某些類型特定的代碼而沒有運行時錯誤)的優點,並且它避免了爲每個傳入的類型編輯inputPort_varExp類的需要。

的想法是創建一個模板類/結構,以一個類型映射到另一個: -

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 
}; 

然後,您可以專注該性狀類: -

template<> 
class DerivativeTrait<Frame> 
{ 
    public: 
    typedef DerivativeType Twist; 
}; 

您現在可以使用此在您的inputPort_varExp中定義a_type_der: -

typedef DerivativeTrait<a_type>::DerivativeType a_type_der; 

注意自C++ 11以來您可以使用usi ng關鍵字而不是typedef。

其他一些選項:

如果你可以編輯你傳遞給inputPort_varExp的類型,你可以只添加一個typedef到這些類 - 這會不會對你的情況,因爲你在爲雙通工作一種。

另一個簡單的選擇是爲a_type_der添加額外的模板參數,但這並不妨礙錯誤的組合(例如Frame和double)。

如果類型可以由編譯器推導出來,您可能還需要考慮decltype。

+0

http://www.drdobbs.com/cpp/c-type-traits/184404270 – ROX

0

感謝@ROX 代碼以備將來參考

template< typename t > 
class DerivativeTrait 
{ 
    public: 
    typedef t DerivativeType; 
}; 
//special cases: Frame and rotation 

template<> 
class DerivativeTrait<KDL::Frame> 
{ 
    public: 
    typedef KDL::Twist DerivativeType; 
}; 


//the class where the derivative is needed 

template<class a_type> class inputPortDerivative_varExp{ 
protected: 
    typedef typename DerivativeTrait<a_type>::DerivativeType a_type_der; 
    RTT::InputPort<a_type> inport; 
    RTT::InputPort<a_type_der> inportDerivative; 
... 
};