Один шаблонный класс (имя) для массивов времени компиляции и выполнения с небольшим дублированием кода - PullRequest
2 голосов
/ 05 января 2012

Существует ли способ создать шаблонный класс, который функционирует как массив для компиляции и среды выполнения (во многом как массив с постоянным размером C89 и тот же массив с переменной длиной C99), который допускает логическую семантику (один параметр шаблона для переменной длинымассив, два для фиксированной длины, очень похожий на std::array).

В довершение ко всему, я бы хотел предотвратить дублирование кода между этими двумя случаями, так как большинство функций идентичны между двумя случаями.Есть ли способ использовать constexpr или enable_if для достижения этой цели?

Ответы [ 2 ]

5 голосов
/ 05 января 2012

Библиотека Eigen линейной алгебры сделала именно это, только с C ++ 03. Их матрицы имеют размеры во время компиляции со специальным значением (Eigen::Dynamic), указывающим, что размер должен быть выбран во время выполнения. Благодаря специализации шаблонов, хранилище реализовано.

Пример:

template <typename Type,int N>
class Array {
   Type data[N];
};

template <typename Type>
class Array<Type,Dynamic> {
   boost::scoped_array<Type> data;
};
1 голос
/ 05 января 2012

Да, нет проблем.Имейте параметр размера со значением по умолчанию -1, и просто сделайте статический if (type chooser) в классе, чтобы выбрать статический массив или динамический массив.

Внутренняя логика должна быть наиболее идентичной, отличатьсядетали могут быть легко решены с помощью перегрузки.

Тогда использование будет:

array<int> x; /* dynamic array */
array<int,10> y; /* static array */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...