Я ищу решение для ванили С++ 98 (без повышения, или qt и т.д.)
Есть ли способ сделать что-то вроде этого:
// valid in c++ 11
std::vector<Foo> vFoo {Foo1, Foo2, Foo3, Foo4} ;
или что-то вроде этого
// Well it is C# but you got the point.
List<Foo> lFoo = new List<Foo>() { Foo1, Foo2, Foo3, Foo4 };
Пока я использую это:
std::vector<Foo> vFoo;
vFoo.push_back(Foo1);
vFoo.push_back(Foo2);
vFoo.push_back(Foo3);
vFoo.push_back(Foo4);
Но я нахожу это уродливым. Любая идея улучшить его? Есть ли особый способ добиться этого?
Спасибо.
Я создаю собственное решение с помощью va_arg
.
#include <cstdarg>
#include <iostream>
#include <vector>
template <typename T>
std::vector<T> initVector (int len, ...)
{
std::vector<T> v;
va_list vl;
va_start(vl, len);
v.push_back(va_arg(vl, T));
for (int i = 1; i < len; ++i)
v.push_back(va_arg(vl, T));
va_end(vl);
return v;
}
int main ()
{
std::vector<int> v = initVector<int> (7,702,422,631,834,892,104,772);
for(std::vector<int>::const_iterator it = v.begin() ; it != v.end(); ++it)
std::cout << *it << std::endl;
return 0;
}
Если вы хотите получить больше ответов, перейдите по ссылке Doc Brown.
Короткий ответ: Нет. Поэтому, почему языковая поддержка таких конструкций была добавлена в С++ 11. Ваше существующее решение push_back
является адекватным, если вы не можете использовать С++ 11.
Вы можете инициализировать вектор из массива:
Foo[] initFoo = { Foo1, Foo2, Foo3, Foo4 };
std::vector<Foo> vFoo(initFoo, initFoo + 4);