您好我想构建一个帮助程序类来初始化一个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);
我可能要问的是什么?
答案 0 :(得分: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 };
}