抱歉,对于社区和c ++来说我都是新手,请保持温柔。

首先,因为它要在微控制器上运行,所以内存和编译后的代码空间非常宝贵。

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

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对象是基础对象,因此它将不包含任何特定于派生对象(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对象。当然,您必须调整其余代码。

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

我不是在告诉不要在微控制器中使用C ++(我是这样做的忠实拥护者!),但这应该有意识地做到。这是在嵌入式系统中使用C ++的精彩文章(两部分):
http://www.embedded.com/design/programming-languages-and-tools/4438660/1/Modern-C--in-embedded-systems---Part-1--Myth-and-Reality

08-17 04:53