#include <cassert>
#include <vector>
using namespace std;
template<typename Type, int Dimension>
const vector<Type> make_fixed_vector(const Type& value = Type())
{
return vector<Type>(Dimension, value);
}
int main(void)
{
vector<int> v3 = make_fixed_vector<int, 3>();
assert(v3.size() == 3);
}
C ++ 1x компиляторы могут определить тип переменной, что удобно при объявлении многомерных «фиксированных» векторов с использованием этой техники:
.
.
.
template<typename Type, int Rows, int Columns>
const vector<vector<Type> > make_fixed_vector_vector(const Type& value = Type())
{
return vector<vector<Type> >(Rows, make_fixed_vector<Type, Columns>(value));
}
int main(void)
{
auto vv = make_fixed_vector_vector<int, 3, 4>(42);
assert(vv.size() == 3);
assert(vv[0].size() == 4);
assert(vv[0][0] == 42);
assert(vv[2][3] == 42);
}
У меня было это простоИдея при программировании функции парсера для выражений списка, которая должна возвращать вектор фиксированного размера вектора целых чисел.Например, vector<vector<int> >(1)
для выражения типа "(0,8)", но vector<vector<int> >(2)
для выражения типа "(3-4) (5)" и так далее.В приложении возможно до 5 заключенных в скобки определений, которые представляют логические ссылки на данные программы.Я сначала пытаюсь разобрать vector<vector<int> >(5)
.Работал?Хорошо, получил справочный тип А, самый подробный.В противном случае vector<vector<int> >(4)
указывает на тип ссылки B и т. Д.
. Для этой цели make_fixed_vector
работал хорошо, но в целом методика имеет недостатки.В частности, поскольку make_fixed_vector
не возвращает истинного типа, его размерность (и) не может быть проверена во время компиляции.Во время выполнения возможны вызовы reserve
, resize
и push_back
.И, поскольку шаблоны функций не могут иметь аргументы шаблона по умолчанию, для пользовательских распределителей требуется больше ввода:
template<typename Type, int Dimension, template<typename> class Allocator>
const vector<Type Allocator<Type> > make_fixed_vector(const Type& value = Type())
{
return vector<Type, Allocator<Type> >(Dimension, value);
}
vector<int> v3 = make_fixed_vector<int, 3, std::allocator>();
и т. Д.и т. д. Но эта техника делает небольшие проекты базовыми.Если это добродетель не имеет отношения, Boost boost::array
может быть более реалистичным.