Ответ, который вы связываете, может почти сделать это. Вам нужна только небольшая модификация, а именно: вам нужно изменить размер контейнера. Это на самом деле главная проблема. Как только вы это сделаете, адаптация решения будет незначительной. Напишите метод insert
, который перераспределяет память и корректирует размер, тогда необходимы лишь незначительные изменения в предлагаемом решении.
Существует одна оговорка, и вы не можете вызывать методы вызова constructur для созданного объекта и присваивать его переменной в той же строке без копии. Для этого можно обеспечить преобразование из Proxy
в Container
. Я бы подумал, что если что-то поместить в одну строку действительно стоит этих затрат, тогда как это можно сделать намного проще в двух линиях.
Я не включил реализацию insert
, потому что это был бы другой вопрос:
#include <iostream>
template<typename Type>
class Container {
private:
struct Proxy {
Container* container;
Proxy(Container* container) : container(container) {}
Proxy& operator,(Type value) {
container->insert(value);
return *this;
}
operator Container() { return *container; }
};
public:
// ...
void insert(const Type& value) {
std::cout << value;
}
Proxy operator<<(Type value) {
insert(value);
return Proxy(this);
}
};
int main() {
Container<int> container = (Container<int>() << 1,2,3);
}
Вывод:
123
PS:
Проблема в том, что в моем проекте везде используется контейнер x = {1,2,3, ...., 1000} с использованием C ++ 11. Теперь я должен опустить C ++ 03, и нет никакого std :: itializer_list
Да, это проблема. Я предполагаю, что 1,2,3,...1000
- просто упрощенный пример, в противном случае вы можете использовать что-то похожее на std::iota
для заполнения контейнера (также доступно только после C ++ 11, но не слишком сложно для реализации). Если это реальная проблема, и вы ищете временный хак, я бы предпочел использовать простые массивы и построить контейнер из этого:
int temp[] = {1,2,3,4,5 ....};
Container<int> x( &temp[0], &temp[999]);