Здравствуйте, я хотел создать вспомогательный класс для инициализации 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);
Возможно ли то, что я спрашиваю?
Да. Делать 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 };
}
Других решений пока нет …