首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有const数组和initializer_list的initializer_list过载构造函数

带有const数组和initializer_list的initializer_list过载构造函数
EN

Stack Overflow用户
提问于 2017-08-19 13:26:53
回答 1查看 1.4K关注 0票数 0

我有一个类,它在构造函数中将引脚的“列表”作为参数。现在,这个“列表”只是一个const数组(const unsigned int (&pins)[N])。我想用一种可以使用initializer_list和(const)数组的方式重载构造函数。

我可以让它与不同的类一起工作,但我无法将它们结合起来。

我的测试类的基本结构:

代码语言:javascript
复制
#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;
};

A类(使用std::initializer_list)

代码语言:javascript
复制
  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;

B类(使用数组)

代码语言:javascript
复制
  public:
    template <size_t N>
    B(unsigned int (&pins)[N])
        : length(N) {
        this->pins = pins;
    }
  private:
    unsigned int *pins;

类C (使用const数组)

代码语言:javascript
复制
  public:
    template <size_t N>
    C(const unsigned int (&pins)[N])
        : length(N) {
        this->pins = pins;
    }
  private:
    const unsigned int *pins;

这让我可以做这样的事情:

代码语言:javascript
复制
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就像预期的那样。

如何将这些不同的构造函数组合在一个类中?我希望能够以上述三种方式之一初始化对象。

如果我让pins成为一个const,我就不能做像memcpy(pins, ...)这样的事情,如果我不把它变成const,我就不能使用const数组作为构造函数的参数。

(目标平台是Arduino,因此不支持大多数花哨的和内存密集型的C++11技巧。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-19 13:52:43

一些类似的东西,也许:

代码语言:javascript
复制
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;
};

演示

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45772095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档