从模板c ++中的模板类中扣除一个类

时间:2016-04-22 13:43:21

标签: c++ templates

我有以下问题: 我有一个类,我需要根据模板类确定对象的类型:

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(Frame)则typeid(a_type_der)= typeid(Twist),

  • 如果typeid(a_type)== typeid(double)则typeid(a_type_der)= typeid(double),

感谢。

2 个答案:

答案 0 :(得分:1)

我使用&#34;类型特征&#34;这里的概念。

这具有编译时解决方案的优点(由于缺少某些类型特定代码而没有运行时错误),并且它避免了为a_type传入的每种类型编辑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起,您可以使用using关键字而不是typedef。

其他一些选择:

如果你能够编辑传递给inputPort_varExp的类型,你可以只为这些类添加一个typedef - 这对你的情况不起作用,因为你将a_type传递给了。

另一个简单的替代方法是为a_type_der添加额外的模板参数,但这并不能防止错误的组合(例如Frame和double)。

如果类型可以由编译器推断,您可能还需要考虑decltype。

答案 1 :(得分: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;
... 
};