2013-03-19 48 views
2

你好,我希望建立一个辅助类来初始化stl valarray。我想要做的是:初始化stl valarray在一行

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

所以我可以只使用一行命令语句在运行时初始化向量。 换做我已经tryed以下结构如下:

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

是否有可能什么,我问:如果我做了以下

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; 
    } 
}; 

这种结构的工作原理?

+0

我不明白你在找什么样的回答了。顺便说一下,'(* this)(data);'为什么? :v – 2013-03-19 10:49:29

+0

@ Magtheridon96我认为他正在寻找valarrays的'Boost Assign'风格初始化 – sehe 2013-03-19 11:13:09

回答

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 }; 
} 
+0

谢谢你很好和快速的回​​答;) – jamk 2013-03-19 12:30:52