0

この話題Variadic template 異種コンテナの続きで、以下に質問したいと思います。動的配列である 2 つのメンバーを持つ複数のクラスがあるとします。ここで、これらのクラスのオブジェクトのシーケンスがあり、異種コンテナーにパックされているとします。このシーケンスでは、配列メンバーの 1 つは「出力」ベクトルであり、別の配列メンバーは「入力」ベクトルであり、前のオブジェクトからの適切な出力配列へのポインターです。このシーケンスは可変個引数テンプレート クラスとして実装されます。

//Classes, objects which are members of the sequence
template<int NumberElements>
struct A 
{
    A() : output(new float[NumberElements]){}//allocate output
    ~A(){delete[] output;}
    float *input;//input vector - pointer to output vector from preceding object of sequence 
    float *output;// output vector (size - NumberElements) of current member of sequence
};   
template<int NumberElements> 
struct B 
{
    B() : output(new float[NumberElements]){}//allocate output
     ~B(){delete[] output;}
    float *input;
    float *output;
};
template<int NumberElements>    
struct C 
{
    C() : output(new float[NumberElements]){}//allocate output
    ~C(){delete[] output;}
    float *input;
    float *output;
};

//Container
template<typename...Arg>
struct HeterogenousContainer
{
    HeterogenousContainer();//Do something to setup the sequence
    std::tuple<Arg...> elements;

};

出力ベクトルに ( new/mallocを介して) 適切にメモリを割り当て、前の出力ベクトルへの入力ポインタを設定するにはどうすればよいですか? たとえば、次のコードを書きます。

HeterogenousContainer<A<5>, B<7>, C<9>> sequence;

シーケンスの最初のメンバーからの入力をnullptr、 2 番目からの入力- 最初からの出力へのポイント などにします。正しく実装するにはどうすればよいですか?

4

2 に答える 2

1

Uselessの 答え(しゃれは意図していません)に触発されて、私はこれを思いつきました:

template<typename...Arg>
struct HeterogenousContainer
{
    std::tuple<Arg...> elements;

    void init(std::integral_constant<std::size_t, 0>)
    {
        std::get<0>(elements).input = nullptr;
    }

    template < std::size_t index = sizeof...(Arg)-1 >
    void init(std::integral_constant<std::size_t, index> = {})
    {
        std::get<index>(elements).input = std::get<index-1>(elements).output;
        init(std::integral_constant<std::size_t, index-1>{});
    }

    HeterogenousContainer()
        : elements{}
    {
        init();
    }
};
于 2013-07-29T22:20:54.893 に答える