Назначьте typedef arraytype в шаблоне - PullRequest
0 голосов
/ 22 января 2020

У меня есть шаблонный класс, как в этом примере:

template<class T>
struct Storage {
    void Push(const T& src) {
        store[i++] = src;  //Is not possible, when T is Tuppel Type
    }
    T store[10];
    int i = 0;
};

Storage<int> ok;
typedef int Tuppel[2];
Storage<Tuppel> nok;

void test() {
    int a = 42;
    Tuppel b = { 1,2 };
    ok.Push(a);
    nok.Push(b);    //Will fail
}

Как сделать этот шаблон действительным? Параметр шаблона T должен иметь одно из следующих значений:

  • Тип примитива
  • Тип объекта (store[i++] = src должен вызывать оператор присваивания)
  • Типы массивов, такие как Tuppel в примере (store[i++] = src должен вызывать оператор присваивания для каждого элемента массива)

1 Ответ

0 голосов
/ 22 января 2020

Вы можете либо специализироваться Storage для типов массивов, и / или использовать std::array вместо [] массивов.

#include <array>

Storage<std::array<int, 2>> also_ok;

template<class T, size_t N>
struct Storage<T[N]> {
    void Push(const T (&src)[N]) {
        std::copy_n(src, N, store[i++]);
    }
    T store[10][N];
    int i = 0;
};

Storage<int[2]> now_ok;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...