gpt4 book ai didi

c++ - 用一个参数初始化 boost::hana::tuple

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:55 25 4
gpt4 key购买 nike

假设我们有这样的东西:某个类 Foo ( 'FooInterface' ) 的接口(interface)和一个包含从 'FooInterface' 派生的类的容器类 Bar。

现在,我将派生类('FooOne'、'FooTwo')的类型列表转发给容器类,并将它们的一个实例存储在一个小的之后的 'boost::hana::tuple' 中类型计算('FooTuple')。

现在如何根据“FooList”的大小使用取消引用的 this 指针初始化元组元素?

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!

最佳答案

hana::replicate 是你的 friend 。

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 构造(如果它们采用引用就是这种情况)。

关于c++ - 用一个参数初始化 boost::hana::tuple,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42248393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com