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