次のようなものがあるとしましょう。Foo( 'FooInterface')クラスのインターフェイスと 'FooInterface'の派生クラスを含むコンテナクラスBarです。boost :: hana :: tupleを1つの引数で初期化
ここで、派生クラスのタイプリスト( 'FooOne'、 'FooTwo')をコンテナクラスに転送し、それらのインスタンスを 'boost :: hana :: tuple'に格納します。小型計算( 'FooTuple')です。
'FooList'のサイズに応じて、逆参照されたthis-pointerでタプル要素を初期化するにはどうすればよいですか?
#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!
花は私を驚かせることは決してありません:) – Yamahari