2

こんにちは、stl valarray を初期化するヘルパー クラスを作成したいと思います。私がしたいのは、次のことです。

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

そのため、行コマンド ステートメントを 1 つだけ使用して、実行時にベクトルを初期化できます。次のことを行うために、次の構造を試しました。

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 に答える