【问题标题】:How to convert a template definition into a class如何将模板定义转换为类
【发布时间】:2017-07-23 15:03:11
【问题描述】:

以下代码在不使用 C++ 类(Arduino 代码)时有效;

MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, midiA);

这将创建一个具有正确类型的变量 midiA。宏定义为:

#define MIDI_CREATE_INSTANCE(Type, SerialPort, Name)                            \
    midi::MidiInterface<Type> Name((Type&)SerialPort);

但是,我想在一个类中使用它(创建一个类变量 midiA),但我无法让它工作。

我现在拥有的是:

class MidiHandler
{
    midi::MidiInterface<(HardwareSerial&) Serial1)> midiA;
}

但是,我收到以下错误:

MidiHandler.h: 23:39: error: type\value mismatch at argument 1 in template parameter list for 'template<class SerialPort, class _Settings> class midi::MidiInterface
  midi*: MidiInterface<((HardwareSerial&)Serial1)> midiA

我想我可能需要将模板添加到类 MidiHandler 中,我也想知道我是否需要在构造函数中对其进行初始化。

【问题讨论】:

  • 你不能用std::function吗?
  • @user0042 以前从未见过,但它只查找函数指针。
  • 您可以将std::function 用于各种可调用对象:函数指针、仿函数类、lambda 表达式。
  • 好的,我需要进一步了解它,谢谢!

标签: c++ class templates arduino


【解决方案1】:

免责声明:我没有 Arduino 来编译和测试它,但从纯 C++ 的角度来看,我会在类声明中声明该成员并在构造函数中对其进行初始化。像这样:

class MidiHandler
{
public:
    MidiHandler(HardwareSerial& serial_port)
        : midiA(serial_port)
    { }

private:
    midi::MidiInterface<HardwareSerial> midiA;
};

然后,像这样实例化类:

MidiHandler handler((HardwareSerial&) Serial1);

详情:

MidiHandler 类有一个名为midiA 类型为midi::MidiInterface&lt;HardwareSerial&gt; 的成员变量,它是一个带有一个模板参数(宏中的Type 参数)的模板。 HardwareSerial 用作模板参数的值。

midi::MidiInterface&lt;HardwareSerial&gt; 类型的构造函数需要一个 HardwareSerial&amp; 类型的参数。所以MidiHandler::MidiHandlerMidiHandler类的构造函数,需要一个相同类型的参数来构造midiA

最后,Serial1 作为构造函数参数传递给handlerSerial1 必须是 HardwareSerial&amp; 类型或可转换为它。 C stile cast (HardwareSerial&amp;) 可能需要也可能不需要,具体取决于 Serial1 的类型,但我把它放在那里,因为宏有它。

【讨论】:

  • 谢谢(包括背后的原因)。我现在拥有的代码(并且我将作为单独的答案放置)但我当然赞成/接受你的代码
【解决方案2】:

如定义所示:

#define MIDI_CREATE_INSTANCE(Type, SerialPort, Name) midi::MidiInterface<Type> Name((Type&)SerialPort);

所以替换你的价值观应该是:

midi::MidiInterface&lt;HardwareSerial&gt; midiA((HardwareSerial&amp;)Serial1);

【讨论】:

    【解决方案3】:

    根据 Luis Guzman 接受的答案进行回答:

    在头文件中:

    midi::MidiInterface<HardwareSerial> midiA;
    midi::MidiInterface<HardwareSerial> midiB;
    midi::MidiInterface<HardwareSerial> midiC;
    

    在构造函数中:

    MidiHandler::MidiHandler()
    : midiA(Serial1),
      midiB(Serial2),
      midiC(Serial3)
    

    【讨论】:

      猜你喜欢
      • 2016-10-21
      • 2021-06-10
      • 2020-09-26
      • 1970-01-01
      • 2023-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      相关资源
      最近更新 更多