我有一个要存储在织物中的类树。我看到了如何为具有空或预定义构造函数的元素实现结构,但我看不到如何使用未预定义的构造函数参数签名来解决问题。所以说我们以一种不直接影响工厂类的方式将不同的类型注册到工厂中。我们的工厂是这样的:
工厂.hpp:
#include <unordered_map>
#include <string>
template<class BaseType, class BaseTypeCode>
class Factory {
public:
typedef BaseType * (*base_creator_fn)();
typedef std::unordered_map<BaseTypeCode, base_creator_fn> registry_map;
static registry_map & registry() {
static registry_map impl;
return impl;
}
static BaseType * instantiate(BaseTypeCode const & name) {
auto it = registry().find(name);
return it == registry().end() ? nullptr : (it->second)();
}
virtual ~Factory() = default;
};
template<class BaseClass, class BaseTypeCode>
struct Registrar {
Registrar(BaseTypeCode name, Factory<BaseClass>::base_creator_fn func) {
Factory<BaseClass>::registry()[name] = func;
}
};
所以问题是:如何将 typedef 设置为 atypedef BaseType * (*base_creator_fn)(...);
而不是 current ()
,其次如何转发其中的参数,instantiate
最后(BaseTypeCode const & name, ...)
如何从采用 const 参数的构造函数中获取新的 base_creator_fn ?
所以我希望最后能得到这样的例子:
示例.hpp:
#include "Factory.hpp"
enum ExampleTypeCode { ExampleTypeCode_Simple = 1 };
class ExampleBase {
virtual ~ExampleBase(){}
};
class Example : public ExampleBase {
Example(int i) {}
virtual ~Example(){}
static Registrar<ExampleBase, ExampleTypeCode> registrar;
};
示例.cpp:
#include <boost/bind.hpp>
#include <boost/lambda.hpp>
#include "Example.hpp"
Registrar<Example, ExampleTypeCode> Example::registrar(ExampleTypeCode_Simple, boost::bind(boost::lambda::new_ptr<Example>, _firstVarArg));
主文件
#include "Example.hpp"
int main() {
ExampleBase * p = Base::instantiate(ExampleTypeCode_Simple, 1);
}
我的主要编译目标是最新的 GCC,遗憾的是带有最新服务包的 Visual Studio 2012 - 所以 C++11 子集非常有限,但尚未提供。