Можно ли рассматривать экземпляр шаблона как пространство имен? - PullRequest
1 голос
/ 29 января 2009

Предположим, у меня есть

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

     static void DoSomethingElse()
     {
     }
 };

 typedef SomeFunctionality<6> SomeFunctionalityFor6;

Семантически «SomeFunctionalityFor6» по сути является пространством имен, специфичным для аргумента шаблона, поэтому в коде используется этот экземпляр шаблона вместо

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

Я предпочел бы иметь возможность использовать выражение "использование" в качестве реального пространства имен

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

Это, как я подозреваю, не работает. Visual studio жалуется, что ей нужно пространство имен, определяемое ключевым словом «namespace» после любого оператора using.

Есть ли способ сделать то, что я пытаюсь сделать? В основном я просто не хочу полностью определять пространство имен каждый раз, когда вызываю статические методы. Я знаю, что это в основном просто синтаксический сахар, но, на мой взгляд, это может сделать код гораздо более читабельным. Мне интересно, есть ли способы непосредственно шаблонизировать пространство имен вместо использования ключевого слова "class".

Ответы [ 2 ]

1 голос
/ 29 января 2009

Или вы можете просто создать локальный объект ...

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

Вы можете заменить / изменить объект SF6 по желанию.

1 голос
/ 29 января 2009

Вы не можете этого сделать. Ни шаблонного пространства имен, ни использования class_name.

Единственные места в коде, которые могут использовать статические функции из класса без квалификации, являются производными классами.

В вашем случае я бы использовал typedef для некоторого короткого имени, например

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