如何将模板定义转换为类

Posted

技术标签:

【中文标题】如何将模板定义转换为类【英文标题】: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 表达式。 好的,我需要进一步了解它,谢谢! 【参考方案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)

【讨论】:

以上是关于如何将模板定义转换为类的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有类名的字符串转换为类类型本身?

如何将此功能组件转换为类

如何将 DataTable 转换为类 Object?

如何将指针函数转换为类函数? C++

Angular 5 / Typescript - 如何将复杂的 json 对象转换为类

如何使用 jOOQ gradle 插件将 postgres 中的 bigint[] 字段转换为类字段