gpt4 book ai didi

C++ header-only 库避免 "using namespace"污染

转载 作者:太空宇宙 更新时间:2023-11-03 10:42:59 30 4
gpt4 key购买 nike

我有一个带有多个命名空间的仅 header C++ 库。

例如一个头文件可能包含

//header1.h
namespace library{
namespace componentA{
template<typename T>
class Someclass{};
}
}

还有一个

//header2.h
namespace library{
namespace componentB{
template<typename T>
class SomeOtherClass{
void Foo(const componentA::Someclass<T>& reference);
void Bar(const componentA::Someclass<T>& reference);
};
}
}

虽然这可行,但拥有一个仅包含头文件的库,一遍又一遍地编写命名空间变得乏味,尤其是当您涉及多个类和嵌套命名空间时。

所以我这样做了:

//new header2.h
namespace library{
namespace componentB{

using namespace componentA;

template<typename T>
class SomeOtherClass{
void Foo(const Someclass<T>& reference);
void Bar(const Someclass<T>& reference);
void FooBar(const Someclass<T>& reference);
void FooWithBar(const Someclass<T>& reference);
};
}
}

虽然这肯定更方便打字,但问题是现在图书馆的客户也可以使用 Someclass<T>通过使用 componentB像这样的命名空间,这会导致接口(interface)不明确,并最终导致代码不一致。例如,客户现在可以使用 componentB::Someclass<T>即使它最初是在 componentA 中定义的

有没有办法让速记只能“私下”使用?

最佳答案

namespace library {
namespace componentAImpl{
using ::library::componentB;
// ...
inline namespace exports{
struct foo{};
}
}
namespace componentA{
using namespace library::componentAImpl::exports;
}
}

用户可以访问 componentAImpl,但不应该。

与此同时,library::componentA 中公开了一组干净的符号。

关于C++ header-only 库避免 "using namespace"污染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30417709/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com