如何将模板函数(Arduino)转换为替代(C)

时间:2017-02-17 11:00:16

标签: c templates

我是C的新手,为了我的学徒,我必须尝试将Arduino代码转换为C代码,但我遇到了麻烦。 在其中一个标题中,我有这个模板:

template <class LinkType> class TPixy
{
public:
  TPixy(uint16_t arg=PIXY_DEFAULT_ARGVAL);
  ~TPixy();

  uint16_t getBlocks(uint16_t maxBlocks=1000);
  int8_t setServos(uint16_t s0, uint16_t s1);
  int8_t setBrightness(uint8_t brightness);
  int8_t setLED(uint8_t r, uint8_t g, uint8_t b);
  void init();

  Block *blocks;

private:
  boolean getStart();
  void resize();

  LinkType link;
  boolean  skipStart;
  BlockType blockType;
  uint16_t blockCount;
  uint16_t blockArraySize;
};

但是C语言没有模板,因此我必须将其转换为“兼容”的东西,因为另一个标头中有typedef来调用此模板:

typedef TPixy<LinkUART> PixyUART;

我以为我可以使用#define将模板转换为宏,但我不知道它是否正确,如果是,我不知道该怎么做。

我该如何解决这个问题?你能救我吗?

1 个答案:

答案 0 :(得分:1)

此模板看起来非常简单,因此您应该只需删除template<LinkType>关键字,只需将所有LinkType替换为LinkUART

但请注意,这是class。你还有很多工作要做,把它全部转换成普通的C,因为那里没有类的支持。

简而言之,删除template关键字,将TPixy类重命名为PixyUART,删除所有成员函数(注意ctor和dtor!),使它们成为独立函数,指向这个班,即:

int8_t setBrightness();

int8_t PixyUART_setBrightness(PixyUART* obj);

在其实施中,将所有this->更改为obj->

您应该最终得到一个现在只有字段的类。将class关键字更改为struct并根据需要添加typedef和任何C闪烁,基本上应该是它。

可能需要做更多的工作,但这是必须的起点。

再次注意ctors和dtors。您需要手动使用它们,因为malloc/free不会自动调用它们。