C++ 使用 const 数组和 initializer_list 重载构造函数
C++ overload constructor with const array and initializer_list
我有一个 class,它将 "list" 个引脚作为构造函数中的参数。
现在,这个 "list" 只是一个常量数组 (const unsigned int (&pins)[N]
)。
我想以这样一种方式重载构造函数,您可以使用 initializer_list 以及 (const) 数组。
我可以让它与单独的 classes 一起工作,但我无法将它们组合起来。
我测试的基本结构class:
#include <iostream>
#include <cstring>
using namespace std;
class X
{
public:
X(... pins);
~X();
void print() {
for (unsigned int i = 0; i < length; i++)
cout << pins[i] << ' ';
}
private:
(const) unsigned int *pins;
const size_t length;
};
Class A(使用std::initializer_list)
public:
A(initializer_list<unsigned int> pins)
: length(pins.size()) {
this->pins = (unsigned int *)malloc(sizeof(unsigned int) * pins.size());
memcpy(this->pins, pins.begin(), sizeof(unsigned int) * pins.size());
}
~A() {
free(pins);
}
private:
unsigned int *pins;
Class B(使用数组)
public:
template <size_t N>
B(unsigned int (&pins)[N])
: length(N) {
this->pins = pins;
}
private:
unsigned int *pins;
Class C(使用常量数组)
public:
template <size_t N>
C(const unsigned int (&pins)[N])
: length(N) {
this->pins = pins;
}
private:
const unsigned int *pins;
这让我可以做如下事情:
A a({1, 2, 3});
unsigned int pb[] = {4, 5, 6};
B b(pb);
const unsigned int pc[] = {7, 8, 9};
C c(pc);
a.print();
b.print();
c.print();
这会按预期打印 1 2 3 4 5 6 7 8 9
。
如何将这些不同的构造函数合并为一个class?
我希望能够以上面显示的三种方式中的任何一种来初始化一个对象。
如果我把 pins
变成 const
,我就不能做像 memcpy(pins, ...)
这样的事情,如果我不把它变成 const
,我可以不要使用常量数组作为构造函数的参数。
(目标平台是 Arduino,因此不支持最花哨和内存密集型的 C++11 技巧。)
大概是这样的:
class X
{
public:
X(std::initializer_list<unsigned int> aPins)
: storage(aPins), length(aPins.size()) {
pins = length ? &storage[0] : nullptr;
}
template <size_t N>
X(unsigned int (&aPins)[N])
: length(N) {
pins = aPins;
}
template <size_t N>
X(const unsigned int (&aPins)[N])
: length(N) {
pins = aPins;
}
void print() {
for (unsigned int i = 0; i < length; i++)
std::cout << pins[i] << ' ';
}
private:
const unsigned int* pins;
const size_t length;
std::vector<unsigned int> storage;
};
我有一个 class,它将 "list" 个引脚作为构造函数中的参数。
现在,这个 "list" 只是一个常量数组 (const unsigned int (&pins)[N]
)。
我想以这样一种方式重载构造函数,您可以使用 initializer_list 以及 (const) 数组。
我可以让它与单独的 classes 一起工作,但我无法将它们组合起来。
我测试的基本结构class:
#include <iostream>
#include <cstring>
using namespace std;
class X
{
public:
X(... pins);
~X();
void print() {
for (unsigned int i = 0; i < length; i++)
cout << pins[i] << ' ';
}
private:
(const) unsigned int *pins;
const size_t length;
};
Class A(使用std::initializer_list)
public:
A(initializer_list<unsigned int> pins)
: length(pins.size()) {
this->pins = (unsigned int *)malloc(sizeof(unsigned int) * pins.size());
memcpy(this->pins, pins.begin(), sizeof(unsigned int) * pins.size());
}
~A() {
free(pins);
}
private:
unsigned int *pins;
Class B(使用数组)
public:
template <size_t N>
B(unsigned int (&pins)[N])
: length(N) {
this->pins = pins;
}
private:
unsigned int *pins;
Class C(使用常量数组)
public:
template <size_t N>
C(const unsigned int (&pins)[N])
: length(N) {
this->pins = pins;
}
private:
const unsigned int *pins;
这让我可以做如下事情:
A a({1, 2, 3});
unsigned int pb[] = {4, 5, 6};
B b(pb);
const unsigned int pc[] = {7, 8, 9};
C c(pc);
a.print();
b.print();
c.print();
这会按预期打印 1 2 3 4 5 6 7 8 9
。
如何将这些不同的构造函数合并为一个class? 我希望能够以上面显示的三种方式中的任何一种来初始化一个对象。
如果我把 pins
变成 const
,我就不能做像 memcpy(pins, ...)
这样的事情,如果我不把它变成 const
,我可以不要使用常量数组作为构造函数的参数。
(目标平台是 Arduino,因此不支持最花哨和内存密集型的 C++11 技巧。)
大概是这样的:
class X
{
public:
X(std::initializer_list<unsigned int> aPins)
: storage(aPins), length(aPins.size()) {
pins = length ? &storage[0] : nullptr;
}
template <size_t N>
X(unsigned int (&aPins)[N])
: length(N) {
pins = aPins;
}
template <size_t N>
X(const unsigned int (&aPins)[N])
: length(N) {
pins = aPins;
}
void print() {
for (unsigned int i = 0; i < length; i++)
std::cout << pins[i] << ' ';
}
private:
const unsigned int* pins;
const size_t length;
std::vector<unsigned int> storage;
};