如何将模板定义转换为类
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<HardwareSerial>
的成员变量,它是一个带有一个模板参数(宏中的Type
参数)的模板。 HardwareSerial
用作模板参数的值。
midi::MidiInterface<HardwareSerial>
类型的构造函数需要一个 HardwareSerial&
类型的参数。所以MidiHandler::MidiHandler
,MidiHandler
类的构造函数,需要一个相同类型的参数来构造midiA
。
最后,Serial1
作为构造函数参数传递给handler
。 Serial1
必须是 HardwareSerial&
类型或可转换为它。 C stile cast (HardwareSerial&)
可能需要也可能不需要,具体取决于 Serial1 的类型,但我把它放在那里,因为宏有它。
【讨论】:
谢谢(包括背后的原因)。我现在拥有的代码(并且我将作为单独的答案放置)但我当然赞成/接受你的代码【参考方案2】:如定义所示:
#define MIDI_CREATE_INSTANCE(Type, SerialPort, Name)
midi::MidiInterface<Type> Name((Type&)SerialPort);
所以替换你的价值观应该是:
midi::MidiInterface<HardwareSerial> midiA((HardwareSerial&)Serial1);
【讨论】:
【参考方案3】:根据 Luis Guzman 接受的答案进行回答:
在头文件中:
midi::MidiInterface<HardwareSerial> midiA;
midi::MidiInterface<HardwareSerial> midiB;
midi::MidiInterface<HardwareSerial> midiC;
在构造函数中:
MidiHandler::MidiHandler()
: midiA(Serial1),
midiB(Serial2),
midiC(Serial3)
【讨论】:
以上是关于如何将模板定义转换为类的主要内容,如果未能解决你的问题,请参考以下文章