代码之家  ›  专栏  ›  技术社区  ›  Doug T.

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

  •  1
  • Doug T.  · 技术社区  · 17 年前

    假设我有

     template< unsigned int num >
     class SomeFunctionality
     {
         static unsigned int DoSomething()
         {
             //...
         }
    
         static void DoSomethingElse()
         {
         }
     };
    
     typedef SomeFunctionality<6> SomeFunctionalityFor6;
    

    从语义上讲,“SomeFunctionalyFor6”本质上是一个特定于模板参数6的命名空间。因此,在代码中使用此模板实例而不是执行

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

    我宁愿能够使用“using”语句作为真正的命名空间

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

    我怀疑这行不通。Visual studio抱怨说,它希望在任何using语句后都有一个由“namespace”关键字定义的命名空间。

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

    2 回复  |  直到 17 年前
        1
  •  1
  •   jpalecek    17 年前

    你不能那样做。既没有模板化命名空间,也没有使用class_name。

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

    在你的例子中,我会用typedef来表示一些短名称,比如

    int main()
    {
           typedef SomeFunctionalityFor6 SF6;
           SF6::DoSomething();
    }
    
        2
  •  1
  •   Mr.Ree    17 年前

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

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

    您可以替换/更改 六氟化硫气体 对象随意。