Задался задачей по написанию шаблонного контейнера, который в памяти хранится как одномерный. При этом со всей необходимой математикой и прочими преобразованиями. Для начала хотелось написать конструктор, который принимал бы на вход многомерный initalizer_list (brace-enclosed initializer_list).
Начал реализацию с этого:
#ifndef ARRAY_H
#define ARRAY_H
#include
using namespace std;
template
T* data;
int* shape;
public:
array(){
this->data = new T[1]{1};
this->shape = new int[1]{1};
}
template
const char* TypeName = typeid(input_data).name(); //
const char* iter = TypeName; //
iter += strlen(TypeName) - 1; //
// Костыльно определяем размерность
int dimensionality = 0; //
while (*iter-- == 'E'){ //
dimensionality++; //
} //
this->shape = new int [dimensionality];
this->shape[0] = input_data.size(); // Костыльно заполняем shape
int input_size = input_data.size();
this->data = new T [input_data.size()]; //
//
const B* item = input_data.begin(); //
//
for (int index_data = 0 ; index_data < input_size ; index_data++){ // Костыльно заполняем data
this->data[index_data] = *item++; //
} //
}
int size(){
return this->shape[0];
}
};
#endif // ARRAY_H
При этом интересующий конструктор работает на одномерных объектах, но, при выполнении следующего кода:
#include
using namespace std;
int main(){
array
cout << "Тест конструктора без аргументов :
" << first_test_array.size() << endl;
array
cout << "Тест конструктора с одномерным initializer_list :
" << second_test_array.size() << endl << endl;
array
cout << "Тест конструктора с многомерным initializer_list :
" << third_test_array.size() << endl;
}
Пишет вот такую ошибку:
In funstion 'int main()':
/home/artyom/CPP/array/main.cpp:16: ошибка: no matching function for call to 'array
/home/artyom/CPP/array/array.h:25: note: template argument deduction/substitution failed:
/home/artyom/CPP/array/main.cpp:16: note: candidate expects 1 argument, 2 provided
array
Может ли мне кто-либо объяснить как это сделать?
Ответ
Скорее всего вам поможет: http://christophercrouzet.com/blog/post/2015/01/12/Nested-Initializer-Lists-for-Multidimensional-Arrays
Код можно посмотреть тут: https://github.com/christophercrouzet/m3ta/blob/master/src/m3ta/. Например, реализация вложенного initializer_list: https://github.com/christophercrouzet/m3ta/blob/master/src/m3ta/nestedinitializerlists.h
Комментариев нет:
Отправить комментарий