2

次のようなものがあるとしましょう。Foo( 'FooInterface')クラスのインターフェイスと 'FooInterface'の派生クラスを含むコンテナクラスBarです。boost :: hana :: tupleを1つの引数で初期化

ここで、派生クラスのタイプリスト( 'FooOne'、 'FooTwo')をコンテナクラスに転送し、それらのインスタンスを 'boost :: hana :: tuple'に格納します。小型計算( 'FooTuple')です。

'FooList'のサイズに応じて、逆参照されたthis-pointerでタプル要素を初期化するにはどうすればよいですか?

MCVE (Wandbox)

#include <iostream> 

#include <boost/hana.hpp> 

namespace hana = boost::hana; 

template <typename FooList> 
class Bar; 

template <typename FooList> 
class FooInterface 
{ 
public: 
    FooInterface(Bar<FooList>& bar) {} 

public: 
    virtual void foo() = 0; 
}; 

class FooOne; 
class FooTwo; 

using MyFooList = decltype(hana::tuple_t<FooOne, FooTwo>); 

class FooOne final 
    : public FooInterface<MyFooList> 
{ 
public: 
    FooOne(Bar<MyFooList>& bar) 
     : FooInterface(bar) 
    {} 

public: 
    void foo() override 
    { 
     std::cout << "FooOne!\n"; 
    } 
}; 

class FooTwo final 
    : public FooInterface<MyFooList> 
{ 
public: 
    FooTwo(Bar<MyFooList>& bar) 
     : FooInterface(bar) 
    {} 

public: 
    void foo() override 
    { 
     std::cout << "FooTwo!\n"; 
    } 
}; 

template <typename FooList> 
class Bar 
{ 
public: 
    using FooTuple = typename decltype(hana::unpack(FooList(), hana::template_<hana::tuple>))::type; 

    FooTuple foos{ *this, *this }; 
}; 

int main() 
{ 
    Bar<MyFooList> b; 
    b.foos[hana::int_c<0>].foo(); 
    b.foos[hana::int_c<1>].foo(); 
} 

出力:これは最も単純な方法であれば

FooOne! 
FooTwo! 

答えて

2

hana::replicateはあなたの友達です。

template <typename FooList> 
class Bar { 
    ... 

    using FooTuple = ...; 
    FooTuple foos; 

    Bar() : foos(hana::replicate<hana::tuple_tag>(*this, hana::size_c<N>)) {} 
}; 

は今、あなたはreplicateでタプルを作成する際に、各*thisのコピーを作ってあげる慎重原因となることがあります。あなたの代わりに参照したい場合は、このようなreference_wrapperを使用します。その後、

foos(hana::replicate<hana::tuple_tag>(std::ref(*this), hana::size_c<N>)) 

FooTupleの各事のコンストラクタは(彼らはリファレンスを取る場合ケースです)reference_wrapperから構成することができることを確認してください。

+0

花は私を驚かせることは決してありません:) – Yamahari

1

わからない - しかし、あなたはそれを行うためにstd::index_sequenceを試みる場合があります:

template <typename FooList> 
class Bar 
{ 
    static constexpr size_t fooListSize = decltype(hana::size(std::declval<FooList>()))::value; 
    template <std::size_t ...I> 
    Bar(std::index_sequence<I...>) : foos{(I, *this)...} {} 

public: 
    using FooTuple = typename decltype(hana::unpack(FooList(), hana::template_<hana::tuple>))::type; 

    Bar() : Bar(std::make_index_sequence<fooListSize>{}) {} 

    FooTuple foos; 
}; 
+0

私はいつもカンマオペレータを忘れています – Yamahari

+0

人々は常に 'hana :: replicate'を忘れています:-) –

関連する問題