像我之前的许多人一样,我正在尝试让我的派生类型自动向我的工厂注册。我通读了很多问题,并试图专注于我在那里没有找到的问题。
除了自动注册之外,一切都运行良好。
我的目标:
- automatically register any derived class of my base class Base
- 只有我标记为的课程可注册的
- not only direct sub-classes of Base
-
ex:基础 -> 设备 -> 相机 ->Webcam
- 这将使使用CRTP http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern就像描述的那样这个问题 https://stackoverflow.com/questions/6399804/automatic-static-invocation-of-derived-types难的
- 对我想要注册的课程进行最小的更改 -假人证明
- would prefer using a registrator class than macros
- like in 这个问题 https://stackoverflow.com/questions/6399804/automatic-static-invocation-of-derived-types,但我不确定这是否取决于CRTP http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
我拥有的:
template <class T>
class abstract_factory
{
public:
template < typename Tsub > static void register_class();
static T* create( const std::string& name );
private:
// allocator<T> is a helper class to create a pointer of correct type
static std::map<std::string, boost::shared_ptr<allocator<T> > > s_map;
};
- 模板化抽象工厂,具有标准::字符串 as key type
- 抽象工厂拥有所有成员和方法static
- 类名会自动恢复typeid(注册时不需要文字名称)
- 拨打电话报名:
abstract_factory<Base>::register_class<MyDerived>();
我尝试过的(或者想要但不知道如何正确):
-
registrator<Derived> class
: templateded class that is instantiated statically in Derived.cpp
and should call abstract_factory::register_class<Derived>()
in it's constructor
- 永远不会被调用或实例化
- 如果我举个例子
Derived
in main()
这有效->虽然有点违背了目的
- 在每个中声明一个简单的静态变量
Derived.hpp
并使用静态注册方法进行设置Derived.cpp
-> 再说一次,永远不会被调用。
- make
abstract_factory
一个真正的单身人士而不是让一切都是静态的?
可以使用任何建议,无论大小,谢谢。
我使用带有会员的单例进行注册,基本上:
template< typename KeyType, typename ProductCreatorType >
class Factory
{
typedef boost::unordered_map< KeyType, ProductCreatorType > CreatorMap;
...
};
使用 Loki,我得到了一些类似的东西:
typedef Loki::SingletonHolder< Factory< StringHash, boost::function< boost::shared_ptr< SomeBase >( const SomeSource& ) > >, Loki::CreateStatic > SomeFactory;
注册通常使用宏完成,例如:
#define REGISTER_SOME_FACTORY( type ) static bool BOOST_PP_CAT( type, __regged ) = SomeFactory::Instance().RegisterCreator( BOOST_PP_STRINGIZE( type ), boost::bind( &boost::make_shared< type >, _1 ) );
这种设置有很多优点:
- 例如与 boost::shared_ptr 一起使用。
- 不需要维护一个巨大的文件来满足所有注册需求。
- 对创作者来说非常灵活,任何事情都进展顺利。
- 该宏涵盖了最常见的用例,同时为替代方案敞开了大门。
调用 .cpp 文件中的宏足以在静态初始化期间获得启动时注册的类型。当类型注册是静态库的一部分时,这很有效,在这种情况下,它不会包含在您的二进制文件中。将注册编译为我所见过的库的一部分的唯一解决方案是拥有一个巨大的文件,该文件将注册显式地作为某种初始化例程的一部分进行。相反,我现在所做的是拥有一个带有我的 lib 的客户端文件夹,用户将其作为二进制构建的一部分包含在内。
从您的要求列表中,我相信这满足了除了使用注册器类之外的所有要求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)