【问题标题】:Is it possible to treat a template instance as a namespace?是否可以将模板实例视为命名空间?
【发布时间】:2009-01-29 15:17:10
【问题描述】:

假设我有

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

     static void DoSomethingElse()
     {
     }
 };

 typedef SomeFunctionality<6> SomeFunctionalityFor6;

从语义上讲,“SomeFunctionalityFor6”本质上是一个特定于模板参数的命名空间,6。所以在代码中使用模板的这个实例而不是做

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

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

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

我怀疑这行不通。 Visual Studio 抱怨它想要一个由“命名空间”关键字定义的命名空间,跟在任何 using 语句之后。

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

【问题讨论】:

    标签: c++ templates namespaces using


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 嗯,好点,你的回答让我思考我是否希望这个特殊情况成为我希望有特殊情况的事情,但决定在这种情况下我宁愿对待它就像命名空间中的一堆免费函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 2014-11-14
      相关资源
      最近更新 更多