C++:有没有办法创建模板化命名空间

C++: Is there a way to create a templated namespace?

本文关键字:建模 命名空间 创建 有没有 C++      更新时间:2023-10-16

我想知道是否可以执行以下操作:

template <typename T>
namespace basic_foo {
    struct str {
        T value;
    };
}
basic_foo<char>::str s1;
namespace foo = basic_foo<char>;
foo::str s2;

是否可以在任何 c++ 编译器中执行此操作?
是否正在开展这项工作来实施这项工作?
我认为这将是对语言的一个很好的补充。

提前谢谢。

不可以,不能定义命名空间模板。 但是,您可以通过将basic_foo作为类模板来实现几乎完全想要的(语法略有不同):

template <typename T>
struct basic_foo {
    struct str {
        T value;
    };
};
basic_foo<char>::str s1;
typedef basic_foo<char> foo;
foo::str s2;

否,但您可以使用模板化结构:

template<typename T>
struct basic_foo
{
    struct str
    {
        T value;
    };
};
typedef basic_foo<char> foo;
foo::str s1;

您也可以使用 class 代替 struct ,但在这种情况下,您必须记住public:

No.这是不可能的,命名空间模板是不真实的,但你可以制作类模板。

其他答案解释了如何做你可能想要的事情。 但听起来您对命名空间的用途与它的实际设计目的不同。

命名空间解决了两个不相关的C++代码库能够相互通信的问题。 C 没有命名空间,因此更加冗长。 尝试在 C 中使用第三方库,例如 openssl 或 oauth。 你会发现很多像这样的函数调用:

openssl_create
openssl_connect

等等。 这真的非常重要。 因为很有可能我想写一个名为 connect 的函数。 我使用的 ZMQ 库的作者也是如此。 等等。 有两个同名的函数试图在同一个地方调用,这是一个主要的痛苦......

命名空间纯粹是一种软件工程构造,而不是编程构造。 它让前缀openssl_简单地成为命名空间,因此像上面这样的代码可以更自由地混合。 为什么命名空间不冲突? 这就是软件工程变得更加人性化和社交的地方,因为本质上全球编程社区必须确保这种情况不会发生。 通常,外部命名空间通常是公司;我猜所有谷歌内部代码都在命名空间Google中。 Java通过推广互联网域名命名包(如命名空间)的约定来解决这个问题,这可能是一个不能冲突的现实世界实体,例如Google代码应该存在于包com.google...

我还应该注意,在组织内,命名空间用于应用程序、产品或团队级别 - 例如,Google 云端硬盘可能像 Google Mail 一样在某处具有"上传"功能,这些团队通常可能不会相互交谈...... 但仍然需要编写混合代码。这就是命名空间的作用。 仅此而已,仅此而已。