次のファクトリ関数があります。
std::auto_ptr<IPath> PathFactory(std::string const& branch_type, CPathModel const& path_model)
{
using namespace boost::assign;
using namespace boost::phoenix::placeholders;
typedef boost::function<IPath* (CPathModel const&)> PathFactoryFunction;
typedef boost::unordered_map<std::string, PathFactoryFunction> FactoryMap;
static FactoryMap factory_map = map_list_of<std::string, PathFactoryFunction>
("plu", &phx::new_<CPluPath>)
("time_of_day", &phx::new_<CTimeOfDayPath>)
("probability", &phx::new_<CProbabilityPath>)
;
std::auto_ptr<IPath> new_path;
FactoryMap::const_iterator it = factory_map.find(branch_type);
if (it != factory_map.end())
{
new_path.reset(it->second(path_model));
}
return new_path;
}
このコードはコンパイルされません。C++03 を使用していることに注意してください。ここで行おうとしているのは、特定の型のオブジェクトを割り当てることができる小さな関数オブジェクトへの文字列のマッピングを作成することです。各オブジェクトは、同じ型 ( ) の 1 つの構築パラメータを取りますCPathModel const&
。
phx::new_
にはいくつかのオーバーロードがあるため、それを直接参照するのはおそらく最善の方法ではありませんが、boost::phoenix を使用してこのコードをクリーンアップし、マッピングをエレガントに機能させる方法を見つけてくれることを願っています。
()
この時点では、パラメーターを取り、new T(p1)
内部で実行するオーバーロードされた演算子を使用して小さなテンプレート クラスを定義する方が簡単に思えます。しかし、これはボイラープレートであり、ブーストにはどこかに良い解決策が必要なほど単純に思えます...