2009-01-29 12 views
1

Supposons que j'aiEst-il possible de traiter une instance de modèle comme un espace de noms?

template< unsigned int num > 
class SomeFunctionality 
{ 
    static unsigned int DoSomething() 
    { 
     //... 
    } 

    static void DoSomethingElse() 
    { 
    } 
}; 

typedef SomeFunctionality<6> SomeFunctionalityFor6; 

sémantiquement, "SomeFunctionalityFor6" est essentiellement un espace de noms spécifique à l'argument de modèle, 6. Ainsi, dans le code en utilisant cette instance du modèle au lieu de faire

int main() 
{ 
     SomeFunctionalityFor6::DoSomething(); 
} 

I « d plutôt avoir la possibilité d'utiliser un « en utilisant » déclaration ala un véritable espace de noms

int main() 
{ 
     using SomeFunctionalityFor6; 
     DoSomething(); 
} 

Cela, comme je suppose ne fonctionne pas. Visual Studio se plaint de vouloir un espace de nommage défini par le mot-clé "namespace" après toute instruction using.

Y at-il de toute façon de faire ce que je suis en train de faire? Principalement je ne veux juste pas qualifier complètement l'espace de noms chaque fois que j'appelle les méthodes statiques. Je sais que c'est surtout du sucre syntaxique, mais à mon avis, cela peut rendre le code beaucoup plus lisible. Je me demande s'il existe même des moyens de modéliser un espace de noms directement au lieu d'avoir à utiliser le mot-clé "class".

Répondre

1

Vous ne pouvez pas faire cela. Ni espace de noms modélisé, ni en utilisant class_name.

Les seuls endroits dans le code qui peut utiliser des fonctions statiques d'une classe sans qualification sont dérivées des classes.

Dans votre cas, je voudrais utiliser un typedef pour un nom court, comme

int main() 
{ 
     typedef SomeFunctionalityFor6 SF6; 
     SF6::DoSomething(); 
} 
1

Ou vous pouvez simplement créer un objet local ...

int main() 
{ 
    SomeFunctionalityFor6 SF6; 
    SF6.DoSomething(); 
} 

Vous pouvez remplacer/changer la SF6 objet à volonté.

+0

Hmm bon point, votre réponse m'a fait penser à si je voulais ce cas particulier d'être quelque chose que je veux qu'il y ait des cas particuliers de, mais a décidé que, dans ce cas, je préfère le traiter comme un bouquet de libre fonctions dans un espace de noms. –