Я считаю, что ваша коллекция должна быть одного типа MyClass (как и в T, должна быть одинаковой), потому что компилятор не будет знать, какие типы вы добавили к каким элементам в коллекции.
Другими словами, если вам нужно добавить 2 элемента в список:
list.Add(new MyClass());
list.Add(new MyClass());
, то попробуйте сослаться на один из них:
var myItem = list[1];
Компилятор не знает, что общего был назначен списку MyClass в элементе 1 , потому что элементы добавляются во время выполнения, но общие значения определяются во время компиляции.
Я уверен, что то, что вы хотите сделать, не может быть сделано.
Если вы заранее знаете количество элементов, возможно, вы могли бы использовать кортеж ?
Вероятно, он использует «размещение новый
» для создания объекта на месте во внутреннем массиве. Размещение новое
не выделяет памяти; он просто помещает объект в указанное вами место и вызывает конструктор. Синтаксис: новый (адрес) Class (constructor_arguments)
.
Конструктор копирования T :: T (T const &)
вызывается для создания копии на месте. Примерно так (упрощенно):
template<T>
void vector<T>::push_back(T const &item) {
// resize if necessary
new (&d_array[d_size++]) T(item);
}
Обратите внимание, что T
должен иметь конструктор копирования, чтобы это работало. По умолчанию (если вы ничего не делаете) он получает один бесплатно. Если вы определите его явно, он должен быть public
, чтобы vector
работал.
Вот как это делает библиотека GNU libstdc ++ , но я сомневаюсь, что это будет быть очень поучительным.
Он использует оператор размещения new и копирует его в единичную память;
Размещение new создает новый элемент по указанному адресу в памяти, в векторном случае, текущий конец ();
void push_back(const T& val){
::new (&*end()) T(val);
[increase end]
}
посмотрите на http://spotep.com/dev/devector.h , который имеет довольно четкий код (в отличие от большинства реализаций STL).