Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我在头中需要匿名名称空间怎么办? 在C++中,匿名命名空间相当于: namespace $$$$ { //something } using namespace $$$$;_C++_Namespaces_Header Files_Anonymous - Fatal编程技术网

如果我在头中需要匿名名称空间怎么办? 在C++中,匿名命名空间相当于: namespace $$$$ { //something } using namespace $$$$;

如果我在头中需要匿名名称空间怎么办? 在C++中,匿名命名空间相当于: namespace $$$$ { //something } using namespace $$$$;,c++,namespaces,header-files,anonymous,C++,Namespaces,Header Files,Anonymous,其中$$$是某种唯一标识符。匿名命名空间对于不应该在编译单元之外看到的代码很有用 到目前为止还不错,但是最近我开始编写一些带有模板的代码,这些代码必须在头中,因此使用匿名名称空间没有多大意义,因为仅仅包含头将消除隔离效果 那么问题是,在这种情况下,建议的方法是什么?我开始使用名为Private的命名命名空间。它并没有真正阻止任何人使用内部标识符,但至少它将名称冲突减少到id“Private” 有更好的方法吗?建议?如果您非常渴望这种隔离,为什么不使用好的旧文件--静态文件呢?这是不确定的: te

其中$$$是某种唯一标识符。匿名命名空间对于不应该在编译单元之外看到的代码很有用

到目前为止还不错,但是最近我开始编写一些带有模板的代码,这些代码必须在头中,因此使用匿名名称空间没有多大意义,因为仅仅包含头将消除隔离效果

那么问题是,在这种情况下,建议的方法是什么?我开始使用名为Private的命名命名空间。它并没有真正阻止任何人使用内部标识符,但至少它将名称冲突减少到id“Private”


有更好的方法吗?建议?

如果您非常渴望这种隔离,为什么不使用好的旧文件--
静态文件呢?这是不确定的:

template <typename T>
static void foo()
{}

int main()
{
    foo<char>();
}
模板
静态void foo()
{}
int main()
{
foo();
}
同样,如果您只需要在一个翻译单元中使用
foo
,那么您可能只将其包含在该翻译单元的标题中,而不管它是否“在标题中”。因此,只需在其他翻译单元中不包含模板,您就已经基本实现了隔离的目标


要真正保证所有可能实例化的隔离(即,包括您在本TU中创建的那些实例化),请如上所述使用
static
,或者使用
detail
名称空间记录您的意图。

坚持使用您的
私有
名称空间
(或者使用更流行的
detail
)。记住C++访问机制背后的主要思想是使其难以滥用,而不是不可能。保护自己不受意外伤害,而不是恶意攻击。

在头中隐藏模板代码实现的最常用方法是将实现放入名为
detail
的命名空间中

例如:

namespace cpputil { // my c++ utility library namespace

  namespace detail { // implementation details of this libraries headers go here

    // a functor private to the library
    template<class T>
    struct private_functor {
      private_functor(const T& t) : _t(t) {}
      void write(std::ostream& os) const { _t.write(os); }
    private:
      const T& _t;
    };

    // an extension to std::ostream::operator<<
    template<class T>
    std::ostream& operator<<(std::ostream& os, const private_functor<T>& pf)
    {
      pf.write(os);
      return os;
    }
  }

  /// a public template function that is designed to allow an object to be emitted to a stream
  /// returns a function object that calls T::write(std::ostream&) when placed into an
  /// output stream
  template<class T>
  detail::private_functor emit(const T& t) {
    return detail::private_functor<T>(t);
  }
}

// can be used like this:

int main() {
  struct S {
    void write(std::ostream& os) const { os << "{I am an S}"; }
  };

  std::cout << cpputil::emit(S) << std::endl;
  return 0;
}
<代码>命名空间CPUTIL {//M+C++实用工具库命名空间 名称空间详细信息{//此库头的实现详细信息请转到此处 //库专用的函子 模板 结构私有函数{ 私有_函子(常数T&T):_T(T){} void write(std::ostream&os)const{u t.write(os);} 私人: 常数T和u T; };
//作为std::ostream::operatorAFAIK的扩展,这就是您所能做的,模板库通常为此目的使用名称空间,如
detail
。理想情况下,您的所有代码都应该位于某种名称空间中。将模板放入称为Utility或Alpha或MyWork之类的名称空间中。并将帮助函数放入其中e也是。谢谢user657267;这是我正在寻找的确认。我担心我遗漏了明显的内容。+1:如果你想在多个TU中使用模板,模板只需要在标题中。