Этот вопрос в шаблон генератора объектов заставлял меня думать о путях автоматизировать его.
По сути, я хочу автоматизировать создание таких функций, как 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
? Я пробовал это, но он не работает в GCC 4.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 ошибается?
Или это просто принципиально невозможно в С++ 0x?
[править]
Предложение N2555 кажется, что это разрешено и GCC утверждает, что реализовала его в GCC4.4.