инициализировать stl valarray в один ряд

Здравствуйте, я хотел создать вспомогательный класс для инициализации stl valarray. Я хотел бы сделать следующее:

std::valarray<float> vec(3);
vlist_of<float>(vec)(2)(3)(5);

Таким образом, я могу просто инициализировать векторы во время выполнения, используя только один оператор строки.
Для этого я попробовал следующую структуру:

template <typename T>
struct vlist_of {
std::valarray<T>& data;
int i;
vlist_of(std::valarray<T>& _data):data(_data),i(0) {
(*this)(data);
}
vlist_of& operator()(std::valarray<T>& data){return *this;}
vlist_of& operator()(const T& t) {
data [i]=t;
i++;
return *this;
}
};

эта структура работает, если я делаю следующее:

vlist_of<float> tmp(vec);tmp(2)(3)(4);

Возможно ли то, что я спрашиваю?

2

Решение

Да. Делать vlist_of заводская функция:

template <typename T>
vlist_builder<T> vlist_of(std::valarray<T>& data)
{
return vlist_builder<T>(data);
}

Теперь работает http://liveworkspace.org/code/48aszl$0.

Я лично предпочел бы равномерную инициализацию:

/*const*/ std::valarray<float> prefer { 2, 3, 5 };

Смотрите полный образец:

#include <valarray>
#include <vector>
#include <iostream>

template <typename T>
struct vlist_builder
{
std::valarray<T>& data;
int i;
vlist_builder(std::valarray<T>& _data):data(_data),i(0) { }
vlist_builder& operator()(const T& t)
{
data[i++]=t;
return *this;
}
};

template <typename T>
vlist_builder<T> vlist_of(std::valarray<T>& data)
{
return vlist_builder<T>(data);
}

int main()
{
std::valarray<float> vec(3);
vlist_of<float>(vec)(2)(3)(5);

for(auto f : vec)
std::cout << f << "\n";

// prefer uniform initialization:
const std::valarray<float> prefer { 2, 3, 5 };
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]