c++ - 将数组各种类型传递给微 Controller 上的规则引擎的要求。类型转换有问题

标签 c++ casting arduino microcontroller

对不起,我是社区和 C++ 的新手,请保持温和。

首先,由于这是在微 Controller 上运行,内存和编译代码空间非常宝贵。

我需要从各种来源获取输入并将其输入中央处理功能。输入的汇总参数将被命名,具有不同的类型,并允许进行类型检查,因此可以将它们与编译时未知的标准进行比较。我从各处借用了一些代码,并提出了以下内容。

template <typename T_ty> struct TypeInfo { static const char * name; };
template <typename T_ty> const char * TypeInfo<T_ty>::name = "unknown";

#define MAKE_TYPE_INFO( type )  template <> const char* TypeInfo<type>::name= #type;

// Type-specific implementations.
MAKE_TYPE_INFO( int );
MAKE_TYPE_INFO( float );
MAKE_TYPE_INFO( String );
MAKE_TYPE_INFO( char * );
MAKE_TYPE_INFO( bool );

class ParaBase
{
public:
  char*   _type ;
  char*   _name;
  void*   _child;

  const char* name()  { return _name; }

  ParaBase(){}

  ParaBase(const char* name, const char* type, const void * child )
    :
    _name( (char*) name ),
    _type( (char*) type ),
    _child( (void*) child ) {}


  template <class U>
  bool is()
  {
    return ( TypeInfo<U>::name == _type );
  }

};

template <class T>
class Para : public ParaBase
{

  T _value;

public:

    Para( const char* name,  const T value )
    :
     ParaBase( name,  TypeInfo<T>::name, this ),
     _value( value )
    {}

    Para( ParaBase& paraBase )
        :
        ParaBase( paraBase._name,  paraBase._type, this )
    {}


  operator T()  { return _value; }

  const T value() { return _value; }

    template <class U>
    U as()
    {
        return *( ( U *)  _value );
    }


};

为了测试它,我做了以下事情:-

ParaBase para[3];

para[0] = Para<char*>("Param-one", "Hi");
para[1] = Para<bool> ("Param-two", true);
para[2] = Para<float>("Param-three", 2.05);

我可以将 para 放入中央函数中。

bool ok = para[1].is<bool>(); // is true
bool notok = para[1].is<char*>(); // is false

所以类型检查有效,是的!

Para<char*> testDownCast =  ( Para<char*>)  para[0] ;
char* orig = testDownCast.as<char*>();

呃,不太好。主要失败在这里。我的 testDownCast 指针 (如果我使用的是正确的术语) 只包含垃圾。我做错了什么?

如有任何帮助,我们将不胜感激。在此先感谢您帮助新手。

最佳答案

你的问题出在这里:

ParaBase para[3];
para[0] = Para<char*>("Param-one", "Hi");

您将 Para 对象分配给 ParaBase 对象。由于 ParaBase 对象是 base 对象,它不会包含任何特定于 derived 对象 (Para) 的信息。在这种情况下,

 T _value;

Para 对象丢失。然后将 ParaBase 对象分配回 Para 对象:

Para<char*> testDownCast =  ( Para<char*>)  para[0] ;

没错,但是para[0]对象不包含任何关于_value的信息,所以不能复制回testDownCast。

为了使您的示例工作,您应该更改 ParaBase 的数组

ParaBase para[3];

ParaBase 指针数组

ParaBase* para[3];
Para<char*> realPara0("Param-one", "Hi");

para[0] = (ParaBase*)&realPara0; //Or use C++-style cast here

当然在这种情况下你不会有 ParaBase 对象,只有指向它们的指针。但是你可以转换回 Para 对象。当然,您必须调整其余代码。

顺便说一句 - 这不是好的低占用微 Controller 代码。对于您使用的每种模板类型,都会生成新代码。此外,每次复制对象都会导致您的堆栈增长(这不是问题直到您有小对象)。 “经典”微 Controller 实现将依赖于 union,并且可能还有关于通过 union 传递的类型的其他信息。

我并不是要告诉不要在微 Controller 中使用 C++(我非常喜欢这个!),但应该在意识到这一点的情况下完成。这是在嵌入式系统中使用 C++ 的精彩文章(两部分): http://www.embedded.com/design/programming-languages-and-tools/4438660/1/Modern-C--in-embedded-systems---Part-1--Myth-and-Reality

关于c++ - 将数组各种类型传递给微 Controller 上的规则引擎的要求。类型转换有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41143448/

相关文章:

c++ - 为什么 (int&)0 格式不正确?

指向类的 C++ 指针,释放类实例的调用函数,这是好的做法吗?

java - 从 "Activity"澄清这个 Java "SamsTeachYourself Java"

python - 在Python中,有没有一种方法可以自动将从父类继承的运算符的派生类操作结果转换为该派生类?

c++ - 从 char 到 const char* 的无效转换

ruby-on-rails - 从 Ruby on Rails 应用程序启动和停止 eventmachine 服务器的最佳选择是什么

python - Arduino 和 PyBluez 之间的蓝牙通信

c++ - string_view 和 basic_string<char> 有什么联系,为什么 string_view 示例代码不起作用?

sql - 转换到自定义域 PostgreSQL

c++ - 在 C++ 中调用带有 char* 参数和 bool 参数的多态函数的优先级