【问题标题】:C++ Smart Factory DesignC++ 智能工厂设计
【发布时间】:2015-07-30 12:52:19
【问题描述】:

不是 c++11

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

1) 创建的元素是对象块

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

3) 块是可扩展的

意思:

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&lt;MemberType*&gt; members#members#.push_back(...)

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

谢谢。

【问题讨论】:

  • 您应该使用std::unique_ptr&lt;MemberType&gt;std::shared_ptr&lt;MemberType&gt; 来存储在集合中,而不是自己管理内存释放/分配。
  • Block 可以(可变参数)模板化吗?
  • 现在,只是为了工厂的理论辩论,一切都很简单。常规指针、常规类型、无模板。
  • 我的意思是,这是一个解决方案,它将当前Block/Factory 声明更改为模板可接受(所以Block&lt;Ts...&gt; 可能知道它的类型)。
  • 可以接受。我希望它会做

标签: c++ factory


【解决方案1】:

以下可能会有所帮助:

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++11。有在早期版本上编译的东西吗?
  • @Gulzar:您可以使用硬编码数字 (10?) 和 void 作为默认参数,而不是可变参数模板。我认为(旧)boost 对 C++03 的 tupleget 有(有限的)实现
  • 如果有人能写一些代码示例来解决这个问题,我将不胜感激,而不是在 c++11 中,这将不胜感激。我不明白你所说的使用硬编码数字和默认无效是什么意思。请添加一些代码谢谢!
  • @Gulzar:你可以使用boost::tuple,对于C++03版本的可变参数,类似template&lt; typename T1 = unspecified, typename T2 = unspecified, ... typename TN = unspecified&gt; class tuple;(硬编码N
  • 没有更好更通用的解决方案? 10 对我来说还不够,100 也是如此
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 2021-12-15
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多