オブジェクトジェネレータパターンに関するこの質問は、それを自動化する方法について考えさせられました。
std::make_pair
基本的に、のような関数の作成を自動化std::bind1st
したいstd::mem_fun
ので、テンプレートクラスタイプごとに異なる関数を作成する代わりに、すべてのケースを一度に処理する単一の可変個引数テンプレートテンプレート関数を作成できます。この関数の使用法は次のようになります。
make<std::pair>(1, 2); // equivalent to std::make_pair(1, 2)
make<std::binder2nd>(&foo, 3); // equivalent to std::bind2nd(&foo, 3);
この関数を書くことは可能make
ですか?これを試しましたが、GCC4.5または4.6では機能しません。
template <template <typename...> class TemplateClass, typename... Args>
TemplateClass<Args...> make(Args&&... args)
{
return TemplateClass<Args...>(std::forward<Args>(args)...);
}
電話をかけようとすると(例make<std::pair>(1, 2)
)
error: no matching function for call to 'make(int, int)'
ここのどこかで構文が間違っていますか?
それとも、これは正しく、GCCは間違っていますか?
それとも、これはC ++ 0xでは基本的に不可能ですか?
[編集]
提案N2555は、これが許可されていることを示唆しているようであり、GCCはGCC4.4でそれを実装したと主張しています。