是否可以将模板实例视为命名空间?

时间:2009-01-29 15:17:11

标签: c++ templates namespaces using

假设我有

 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抱怨它需要在任何using语句之后使用“namespace”关键字定义的命名空间。

反正有没有做我想做的事情?主要是我只是不想在每次调用静态方法时完全限定命名空间。我知道它主要只是语法糖,但在我看来它可以使代码更具可读性。我想知道是否有方法直接模板化命名空间而不必使用“class”关键字。

2 个答案:

答案 0 :(得分:1)

你做不到。既不是模板化的命名空间,也不是使用class_name。

代码中唯一可以使用类中没有限定条件的静态函数的地方是派生类。

在你的情况下,我会使用typedef作为一些简短的名字,比如

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

答案 1 :(得分:1)

或者你可以创建一个本地对象......

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

您可以随意更换/更改 SF6 对象。