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