我有以下问题: 我有一个类,我需要根据模板类确定对象的类型:
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),
感谢。
答案 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;
...
};