gpt4 book ai didi

C++智能工厂设计

转载 作者:行者123 更新时间:2023-11-28 02:22:56 25 4
gpt4 key购买 nike

不是 c++11

我需要用 C++ 编写一个像这样工作的工厂:

1) 创建的元素是对象 block

2) 工厂保存对所有此类子对象的引用。

3) block 是可缩放的

含义:

class Block{
MemberType member1;
MemberType member2;
MemberType member3;
Block(){...}
}

class Factory{
set<MemberType*> members1;
set<MemberType*> members2;
set<MemberType*> members3;

Block& makeBlockInstance(){
Block& currentBlock = *(new Block());

members1.push_back(&(currentBlock.member1));
members2.push_back(&(currentBlock.member2));
members3.push_back(&(currentBlock.member3));

return currentBlock;
}
}
  • 请不要介意语法错误或次要细节,代码是为了说明问题。

我需要的是一种在 Block 中添加或删除成员的方法,以自动创建或删除 set<MemberType*> members# 的方式, 和 members#.push_back(...) .

这可能吗?这似乎是通过反射完成的事情,但我想要一些非反射的方式来静态地做到这一点。

谢谢。

最佳答案

以下内容可能会有所帮助:

template<typename ... Ts> struct BlockFactoryT;

template<typename ... Ts>
struct BlockT
{
using Factory = BlockFactoryT<Ts...>;

BlockT(){...}

std::tuple<Ts...> members;
};

template<Ts...>
struct BlockFactoryT{
using Block = BlockT<Ts...>;
std::tuple<set<Ts*>> members_sets;

std::unique_ptr<Block> makeBlockInstance()
{
return makeBlockInstanceImpl(std::index_sequence_for<Ts...>());
}

template<std::size_t ... Is>
std::unique_ptr<Block> makeBlockInstanceImpl(std::index_sequence<Is...>)
{
auto block = std::make_unique<Block>();

const int dummy[] = {0,
(std::get<Is>(members_sets).insert(&std::get<Is>(block->members)), 0)...};
static_cast<void>(dummy); // Remove warning for unused variable
return block;
}
};

为了简单起见:

using MyBlock = BlockT<MemberType, MemberType, MemberType2>;
using MyFactory = typename MyBlockT::Factory;

关于C++智能工厂设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31724320/

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