Как залить данные в контейнер сразу без временной переменной в C ++ 03 - PullRequest
2 голосов
/ 20 апреля 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;
};

Я хочу, чтобы что-то сразу заполнило данные в контейнер, как это

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

или

Container<int> container(3);
container.fill({100,200,300});

или

Container<int> container{100,200,300};

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

Я НЕ хочу вводить какую-либо временную переменную

// I do not like this...
int data[]={1,2,3};
Container<int> container(3);
container.fill(data,data+3);

Как можно Я реализую это в C ++ 03?

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

Приложение A:

Что-то похожее - это Eigen 'comma-initializer

RowVectorXd vec1(3);
vec1 << 1, 2, 3;

Приложение B:

Я знаю, что легко использовать C ++ 11 std :: initializer_list для реализации чего-то вроде

Container<int> container{100,200,300};

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Используйте простой прокси-объект и перегрузите operator<< и operator,. Простой пример:

template<typename Type>
class Container {
private:
    struct Proxy {
        Type* data;
        Proxy(Type* data) : data(data) {}

        Proxy operator,(Type value) {
            *data = value;
            return Proxy(data + 1);
        }
    };

public:
    // ...

    Proxy operator<<(Type value) {        
        *data = value;
        return Proxy(data + 1);
    }
};

Тогда container << 100, 200, 300; будет переведено в

container.data[0] = 100;
container.data[1] = 200;
container.data[2] = 300;

Демо

0 голосов
/ 28 апреля 2020

Если ваш контейнер следует правилам и интерфейсам контейнеров STL, то у него будет элемент push или push_back, который можно добавить без создания временного списка:

Container<int> container(size);
container.push_back(1); container.push_back(2); container.push_back(3); // etc

Не удобно, конечно, но это «точка входа», из которой вы, вероятно, захотите создать свое собственное решение. Вы даже можете реализовать прокси, предоставляемый @Evg в общем, что означает, что он будет работать с несколькими типами контейнеров.

Для примера того, как работает реализация c, взгляните на _seq().

от cxxomfort. По какой-то конкретной причине вы не хотите вводить временный массив? Если вы используете какой-либо приличный компилятор после 1990 года и объявляете этот массив как const, компилятор должен покончить с ним и привести к объектному коду, который, вероятно, лучше любого настраиваемого прокси, особенно если компилятор должен работать со ссылками .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...