gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:42:53 25 4
gpt4 key购买 nike

我有以下问题:我有一个类,我需要在其中确定模板类函数中对象的类型:

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

在我的例子中,我想使用以下逻辑自动扣除 a_type_der:

  • if typeid(a_type)==typeid(Frame) then typeid(a_type_der)=typeid(Twist),

  • 如果 typeid(a_type)==typeid(double) 那么 typeid(a_type_der)=typeid(double),

  • 等等

谢谢。

最佳答案

我会在这里使用“类型特征”的概念。

这具有作为编译时解决方案的优点(不会因缺少某些特定于类型的代码而导致运行时错误),并且避免了为作为 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 - 这对您的情况不起作用,因为您将 double 作为 a_type 传递。

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

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

关于c++ - 从模板c++中的模板类中扣除一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36795502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com