Инициализация массива шаблонов со списком значений - PullRequest
3 голосов
/ 21 марта 2011

В стандарте c ++ мы можем написать:

int myArray[5] = {12, 54, 95, 1, 56};

Я хотел бы написать то же самое с шаблоном:

Array<int, 5> myArray = {12, 54, 95, 1, 56};

при условии, что

template <class Type, unsigned long N>
class Array
{
public:

    //! Default constructor
    Array();

    //! Destructor
    virtual ~Array();

    //! Used to get the item count
    //! @return the item count
    unsigned long getCount() const;

    //! Used to access to a reference on a specified item
    //! @param the item of the item to access
    //! @return a reference on a specified item
    Type & operator[](const unsigned long p_knIndex);

    //! Used to access to a const reference on a specified item
    //! @param the item of the item to access
    //! @return a const reference on a specified item
    const Type & operator[](const unsigned long p_knIndex) const;

private:

    //! The array collection
    Type m_Array[N];
};

Я думаю, что это невозможно, но может быть, есть хитрый способ сделать это!

Ответы [ 5 ]

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

Мое решение - написать шаблон класса, который накапливает все значения, которые передаются в конструктор.Вот как вы можете инициализировать ваш Array сейчас:

Array<int, 10> array = (adder<int>(1),2,3,4,5,6,7,8,9,10);

Реализация adder показана ниже с полной демонстрацией:

template<typename T>
struct adder
{
   std::vector<T> items;
   adder(const T &item) { items.push_back(item); }
   adder& operator,(const T & item) { items.push_back(item); return *this; }
};

template <class Type, size_t N>
class Array
{
public:

    Array(const adder<Type> & init) 
    {
         for ( size_t i = 0 ; i < N ; i++ )
         {
               if ( i < init.items.size() )
                   m_Array[i] = init.items[i];
         }
    }
    size_t Size() const { return N; }
    Type & operator[](size_t i) { return m_Array[i]; }
    const Type & operator[](size_t i) const { return m_Array[i]; }

private:

    Type m_Array[N];
};

int main() {

        Array<int, 10> array = (adder<int>(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

Посмотрите онлайн-демонстрацию на ideone самостоятельно: http://www.ideone.com/KEbTR

2 голосов
/ 21 марта 2011

Это становится возможным в C ++ 0x с использованием списков инициализаторов . В настоящее время нет способа сделать это.

Самое близкое, что вы можете получить без этого, это использовать Boost.Assign .

1 голос
/ 21 марта 2011

Еще одно решение, которому не нужен adder шаблон класса. Теперь вы можете сделать это:

int main() {

        Array<int, 10> 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/I0L1C

1 голос
/ 21 марта 2011

Это на самом деле очень тривиально; просто удалите конструкторы и сделать членов данных общедоступными. Шаблон выпуска красный Геринг; применяются те же правила, что и для любого класса: если это агрегат, вы можете использовать агрегатную инициализацию; если нет, ты не можешь.

- Джеймс Канзе

0 голосов
/ 21 марта 2011

Ты прав.Это невозможно с текущим стандартом C ++.Однако со следующим стандартом (c ++ 0x) списки инициализаторов сделают именно это!

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