2

你好我想建立一个帮助类来初始化一个 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);

我要问的可能吗?

4

1 回答 1

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 };
}
于 2013-03-19T10:46:25.977 回答