Cette question sur l' objet générateur de modèle m'a fait penser à des façons de l'automatiser.
Essentiellement, je veux automatiser la création de fonctions comme l' std::make_pair
, std::bind1st
et std::mem_fun
, de sorte qu'au lieu d'avoir à écrire une fonction différente pour chaque modèle type de classe, vous pouvez écrire une seule variadic template modèle de la fonction qui gère tous les cas à la fois. L'utilisation de cette fonction serait:
make<std::pair>(1, 2); // equivalent to std::make_pair(1, 2)
make<std::binder2nd>(&foo, 3); // equivalent to std::bind2nd(&foo, 3);
Est-il possible d'écrire cette fonction make
? J'ai essayé ceci, mais il ne fonctionne pas dans GCC 4.5 ou 4.6:
template <template <typename...> class TemplateClass, typename... Args>
TemplateClass<Args...> make(Args&&... args)
{
return TemplateClass<Args...>(std::forward<Args>(args)...);
}
Si j'essaie de les appeler (e.g) make<std::pair>(1, 2)
je viens d'obtenir
error: no matching function for call to 'make(int, int)'
J'ai obtenu la syntaxe de mal n'importe où ici?
Ou est ce droit et GCC est le problème?
Ou est-ce juste fondamentalement impossible en C++0x?
[modifier]
Proposition N2555 semble suggérer que ce qui est permis et GCC prétend avoir mis en œuvre dans GCC4.4.