将stl valarray初始化为一行

时间:2013-03-19 10:40:16

标签: c++ arrays 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);

我可能要问的是什么?

1 个答案:

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