Реализация инициализатора массива - PullRequest
5 голосов
/ 22 марта 2011

Вы можете объявить и инициализировать обычные массивы в одной строке, например:

int PowersOfTwo[] = {1, 2, 4, 8, 16, 32, 64, 128};

Есть ли способ воспроизвести это поведение в пользовательских классах? Так, например:

MyClass<int> PowersOfTwo = {1, 2, 4, 8, 16, 32, 64, 128};

У вас может быть конструктор копирования, принимающий массив в качестве параметра, но вам все равно нужно объявить массив в предыдущей строке.

int InitializationArray[] = {1, 2, 4, 8, 16, 32, 64, 128};
MyClass<int> PowersOfTwo = InitializationArray; 

Ответы [ 2 ]

6 голосов
/ 22 марта 2011

Вы можете реализовать свой класс таким образом, что вы можете написать это:

MyClass<int> array;
array = 1,2,3,4,5,6,7,8,9,10;//dont worry - all ints goes to the array!!!

Вот моя реализация:

template <class T>
class MyClass
{
   std::vector<T> items;
public:

    MyClass & operator=(const T &item)
    {
       items.clear();
       items.push_back(item);
       return *this;
    }
    MyClass & operator,(const T &item)
    {
       items.push_back(item);
       return *this;
    }
    size_t Size() const { return items.size(); }
    T & operator[](size_t i) { return items[i]; }
    const T & operator[](size_t i) const { return items[i]; }

};

int main() {

        MyClass<int> array;
        array = 1,2,3,4,5,6,7,8,9,10;
        for (size_t i = 0 ; i < array.Size() ; i++ )
           std::cout << array[i] << std::endl;
        return 0;
}

Выход:

1
2
3
4
5
6
7
8
9
10

Смотрите онлайн демо: http://www.ideone.com/CBPmj

Здесь вы можете увидеть два похожих решения, которые я разместил вчера:

Инициализация массива шаблонов со списком значений


EDIT:

Подобные приемы, которые вы можете сделать, чтобы заполнить существующие контейнеры STL. Например, вы можете написать это:

std::vector<int> v;
v+=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; //push_back is called for each int!

Все, что вам нужно перегрузить () и , оператор как:

template<typename T>
std::vector<T>& operator+=(std::vector<T> & v, const T & item)
{
    v.push_back(item); return v;
}
template<typename T>
std::vector<T>& operator,(std::vector<T> & v, const T & item) 
{
    v.push_back(item); return v;
}

Рабочая демоверсия: http://ideone.com/0cIUD


СНОВА РЕДАКТИРОВАТЬ:

Я весело с оператором C ++ . Теперь это:

std::vector<int> v;
v << 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; //inserts all to the vector!

Я думаю, это выглядит лучше!

4 голосов
/ 22 марта 2011

Это может быть сделано только в том случае, если ваш компилятор обеспечивает поддержку списков инициализаторов , функции C ++ 0x.

В противном случае потребуется использовать другой синтаксис, как в boost.assign библиотека.

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