【发布时间】:2020-05-30 14:27:50
【问题描述】:
我正在寻找一种方法来通过我自己的类的构造函数(它基本上应该包装 FastLED 库)传递基于模板的类(具体来说是FastLED library on Arduino 的主类)的模板参数)。我想在主函数中指定初始化 FastLED 所需的模板参数,以便编译前的所有预配置(即下面第三个代码块中的 #defines)通过主文件中的常量工作。我怎样才能做到这一点?
目前,我的班级是这样的:
LEDState.h:
#pragma once
#include "FastLED.h"
FASTLED_USING_NAMESPACE
class LEDState {
private:
CRGB* _leds;
CRGB* _pixels;
const uint16_t _pixel_count;
const uint16_t _led_count;
const uint8_t _mapmode;
public:
LEDState(const uint16_t pixel_count, const uint8_t mapmode);
void show();
};
LEDState.cpp:
#include "LEDState.h"
LEDState::LEDState(const uint16_t pixel_count, const uint8_t mapmode)
: _pixel_count(pixel_count), _mapmode(mapmode), _led_count(_pixel_count * (_mapmode & 0x0f))
{
_leds = (CRGB*)malloc(_led_count * sizeof(CRGB));
_pixels = (CRGB*)malloc(_pixel_count * sizeof(CRGB));
FastLED.addLeds<CHIPSET, DATA_PIN, CLOCK_PIN, COLOR_ORDER>(_leds, _led_count);
}
void LEDState::show() {
for( int p = 0; p < _pixel_count; p++ ) {
_leds[p] = _pixels[p];
}
FastLED.show();
}
我的问题是我没有找到通过LEDState的构造函数传递模板参数<CHIPSET, DATA_PIN, CLOCK_PIN, COLOR_ORDER>的方法。
有没有办法从我的主文件初始化我的包装类和包装的 FastLED 库?我想象我的main.ino 文件是这样的:
#include "LEDState.h"
#define CHIPSET APA102
#define DATA_PIN 23
#define CLOCK_PIN 18
#define COLOR_ORDER GRB
LEDState state = LEDState<CHIPSET, DATA_PIN, CLOCK_PIN, COLOR_ORDER>(led_count, map_mode);
void setup() {
}
void loop() {
LEDState.show();
}
(APA102 和 GRB 是 FastLED 库中的常量。)
这样的事情可能吗?
(我不确定我知道寻找解决方案的正确词汇,更不用说在这个问题中使用正确的术语了。我发现的所有内容要么不是我的问题的解决方案,要么我不明白这是一个解决方案。我来自“普通的 Arduino C”;我对 C++ 模板的了解大致在:我可以通过修补现有模板代码来工作,但我不知道如何创建模板。)
编辑:有了 cmets 和第一个答案,我想我的课程也需要模板化。我尝试从 FastLED 库中复制模板参数列表(请参阅上面的链接),从而得到此类定义:
template<ESPIChipsets CHIPSET, uint8_t DATA_PIN, uint8_t CLOCK_PIN, EOrder COLOR_ORDER>
class LEDState {
...
}
(ESPIChipsets 和 EOrder 由 FastLED 定义)
现在编译器抱怨
LEDState.cpp:3:1: error: invalid use of template-name 'LEDState' without an argument list
LEDState::LEDState(const uint16_t pixel_count, const uint8_t mapmode)
^
我还需要什么来编译它?
【问题讨论】:
-
我不关注.. 如果您需要
LEDState作为模板,是什么阻止您将其设为模板? -
@AlgirdasPreidžius 因为我不知道它本身需要是一个基于模板的类。如果确实如此,我的问题是“我需要知道什么才能将我的课程变成模板?”
-
@orithena
I don't know that it would need to be a template-based class itself我们也不知道,因为不清楚这对您是否重要,so that all pre-configuration before compiling works也不清楚。我们不知道你从哪里得到CHIPSET、DATA_PIN、CLOCK_PIN、COLOR_ORDER。 -
我怀疑您只需要模板化您的
LEDState构造函数。这样您就可以简单地将模板参数传递给FastLED.addLeds调用。
标签: c++ class templates constructor