命名空间模板函数和隐藏命名空间变量

时间:2013-11-18 22:52:24

标签: c++ templates namespaces private

我正在编写一个命名空间,需要内部的某些函数才能访问特定的变量(也在命名空间中声明)。通常,当我这样做时,我在.cpp文件中声明了变量,以防止外部访问它。

·H

namespace Example
{
    int myFunc();
}

的.cpp

namespace Example
{
    int hiddenVar;

    int myFunc()
    {
        .. do something with hiddenVar
        return someValue;
    }
}

我的问题是我需要定义一个需要访问这个隐藏变量的模板函数。不幸的是,由于必须在头文件中定义模板函数的主体,因此它无法访问隐藏在.cpp中的变量。

·H

namespace Example
{
    template< typename T >
    void myFunc( const T& myT )
    {
         .. do something with hiddenVar  // doesnt know what hiddenVar is
    }
}

的.cpp

namespace Example
{
    int hiddenVar;
}

是否有一个隐藏在命名空间内的变量,同时在标题访问中给出一个模板函数?

3 个答案:

答案 0 :(得分:1)

·H:

namespace Example
{
  int * get_hiddenVar();  
  template< typename T >
  void myFunc( const T& myT )
  {
     int *  hiddenVarPtr = get_hiddenVar();
     .. do something with *hiddenVarPtr  
  }
}

的.cpp

namespace Example
{
   int hiddenVar=0;
   int * get_hiddenVar()
   {
      return &hiddenVar;
   }
}

答案 1 :(得分:0)

您无法直接执行此操作,但可以使用某项功能。由于hiddenVar不依赖于模板参数,因此您可以执行以下操作:

·H

namespace Example
{
  void Function(); // Use the right function prototype here, of course,
                   // as long as it does not depend on T

  template<typename T>
  void myFunc(const T& myT)
  {
    //...
    Function();
    //...
  }
}

的.cpp

namespace Example
{
  int hiddenVar;
  void Function()
  {
    // Do something with hiddenVar
  }
}

如果您使用hiddenVar取决于T,当然,您运气不佳。

答案 2 :(得分:0)

将它放在名为“详细信息”的嵌套命名空间中,然后不要担心。

使用命名空间和私有等隐藏变量不是安全构造,而是为了更好的代码。