我猜你是在寻找注册模式。这只是我的草稿,所以不要依赖它。
class AbstractFooFactory
{
virtual AbstractFoo* create( ParamsType cons& params ) = 0;
virtual void createAndCallMethod( ParamsType cons& params ) = 0;
};
class FooRegister
{
~FooRegister();
template< typename FooFactory >
void operator() ( FooFactory const & factory )
{ map[factory.getName()]= new FooFactory( factory ); }
AbstractFooFactory* get( std::string name );
std::map< std::string , AbstractFooFactory* > map;
};
template< typename Scalar, typename Integrator, typename Dimension >
class FooFactory: public AbstractFooFactory
{
typedef FooFactory<Scalar, Integrator, Dimension > type;
std::string getName();
AbstractFoo* create( ParamsType cons& params );
void createAndCallMethod( ParamsType cons& params );
};
简单的轨迹可以用于存储类型名称:
template< typename Type >
struct NameTrails
{
static const char const* value;
};
template<> const char const* NameTrails<int>::value = "Int";
template<> const char const* NameTrails<float>::value = "Float";
template<> const char const* NameTrails<double>::value = "Double";
template<> const char const* NameTrails<Simple>::value = "Simple";
template<> const char const* NameTrails<Complex>::value = "Complex";
template< typename Scalar, typename Integrator, typename Dimension >
std::string FooFactory::getName()
{
return boost::lexical_cast<std::string>( Dimension::value ) + "D"
+ NameTrails< Integrator >::value
+ NameTrails< Scalar >::value;
}
现在,您需要使用mpl::for_each注册所有类型:
FooRegister fooRegister;
typedef boost::mpl::vector<Simple,Complex> IntegratorsList;
typedef boost::mpl::vector<int,float,double> ScalarsList;
typedef boost::mpl::range_c<int,1,4> DimensionsList;
typedef boost::mpl::vector<
boost::mpl::vector< Simple, float, boost::mpl::int_<2> >,
boost::mpl::vector< Simple, double, boost::mpl::int_<3> >,
... other types or full cross join ... > FooList;
boost::mpl::for_each< FooList, boost::mpl::quote3<FooFactory> >(
boost::ref(fooRegister) );
我不知道的是如何交叉连接 IntegratorsList,ScalarList,range_c<int,1,4>
来构建完整的 FooList。
fooRegister.get("2DSimpleFloat")->createAndCallMethod(params)
你可能想要以静态方式实现这个,所以是可以的,但我发现要比一个简单的动态映射或哈希映射实现更好的性能相对困难。
foo
的类型必须是字符串比较吗?什么是params
?它包含任何决定模板参数的信息吗? - Ray