2009-06-02 2 views
2

Je crée une bibliothèque pour autoriser les types de données algébriques de type OCaml/Haskell et la correspondance de formes. Les types de données algébriques sont implémentés en utilisant une classe similaire à Boost.Variant. Je voudrais pouvoir définir de nouveaux types (le constructeur) dans les arguments du template, mais j'obtiens une erreur. J'utilise mon propre type avec des modèles variés, mais j'utiliserai ici variant de Boost pour plus de simplicité. Pourquoi ce n'est pas quelque chose comme ceci:Pourquoi ne pouvez-vous pas définir de nouveaux types dans un argument de modèle C++?

typedef variant < 
    class Foo { ... }, 
    class Bar { ... } 
> Baz; 

autorisé? Je sais que je peux définir les types séparément, mais cela signifie que je ne peux pas utiliser de belles macros. Dans la plupart des cas en C++, vous êtes a permis de définir un nouveau type où vous utilisez, par exemple:

struct Foo { ... } bar; 

Ici, je suis en train de définir un nouveau type Foo et une bar variable de type Foo. Si des choses comme ça sont autorisées, pourquoi cela ne fonctionne-t-il pas avec les templates?

Répondre

1

Je suppose que c'est parce que les arguments de modèle sont traités similaires arguments de fonctions et vous ne pouvez pas déclarer

void func(class A{} a, class B{} b); 

soit. Je pense aussi qu'il serait impossible d'obéir au ODR si vous avez besoin des classes dans plus d'un modèle (typedef).

2

Il n'y a vraiment aucune raison pour laquelle, sauf que ce n'est pas là et je suppose qu'il n'a pas été proposé d'être ajouté, ou si elle l'a fait, n'a pas eu assez de soutien.

Si vous voulez poursuivre, je vous suggère de commencer par le comité des normes

http://www.open-std.org/Jtc1/sc22/wg21/

-1

Je pense que venir C++0x Concepts est assez proche, mais pas exactement la même chose que ce que vous décrivez.

+0

Cela n'a rien à voir avec cela. – Zifre

Questions connexes