Можно ли построить контейнер и заполнить данные в одну строку, используя C ++ 03? - PullRequest
0 голосов
/ 21 апреля 2020

Предположим, у меня есть Container.

template<typename Type>
class Container
{
public:
    Container(int size_)
    {
        size=size_;
        data = new Type[size];
    }
    ~Container()
    {
        delete [] data;
    }

private:
    int size;
    Type* data;
};

. Я хочу создать контейнер и заполнить его данными в одну строку, используя C ++ 03

// very easy to implement using C++11 std::initializer_list
Container<int> container{100,200,300}

или

Container<int> container(100,200,300)

или

// other one line solution

после этого, data[0]=100,data[1]=200,data[2]=300.

Спасибо за ваше время.

Приложение

Похожий вопрос

Evg уже дать ответ может реализовать решение в две строки.

Container<int> container(3);
container << 100, 200, 300;

Мне все еще интересно, существует ли решение в одну строку?

1 Ответ

1 голос
/ 21 апреля 2020

Ответ, который вы связываете, может почти сделать это. Вам нужна только небольшая модификация, а именно: вам нужно изменить размер контейнера. Это на самом деле главная проблема. Как только вы это сделаете, адаптация решения будет незначительной. Напишите метод 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]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...