我想知道是否可以执行以下操作:
template <typename T>
namespace basic_foo {
struct str {
T value;
};
}
basic_foo<char>::str s1;
namespace foo = basic_foo<char>;
foo::str s2;
是否可以在任何 c++ 编译器中执行此操作?
是否正在开展工作来实现这一点?
我认为这将是对语言的一个很好的补充。
提前致谢。
我想知道是否可以执行以下操作:
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
您必须记住 about 。public:
不,不可能,命名空间模板是不真实的,但你可以制作类模板。
其他答案解释了如何执行您可能想要的操作。但听起来您对命名空间的用途与它的真正设计用途有不同的想法。
namespace 解决了两个不相关的 C++ 代码库能够相互通信的问题。C 没有名称空间,因此更加冗长。尝试在 C 中使用 3rd 方库,例如 openssl 或 oauth。您会发现很多这样的函数调用:
openssl_create
openssl_connect
等等。这真的非常重要。因为我很可能想编写一个名为connect
. 我使用的 ZMQ 库的作者也是如此。等等。试图在同一个地方调用两个具有相同名称的函数是一个主要的、主要的痛苦......
命名空间纯粹是一种软件工程构造,而不是编程构造。它让前缀openssl_
简单地成为命名空间,因此像上面这样的代码可以更自由地混合。为什么命名空间不冲突?这就是软件工程变得更加人性化和社会化的地方,因为本质上全球编程社区必须确保这种情况不会发生。通常外部命名空间通常是公司;我猜所有 Google 内部代码都在 namespace 中Google
。Java 通过促进互联网域名命名包(如命名空间)的约定来解决这个问题,这可能是一个不能冲突的现实世界实体,例如谷歌代码应该存在于包中com.google...
我还应该注意,在组织内,名称空间用于应用程序、产品或团队级别 - 例如,Google Drive 可能像 Google Mail 一样在某处具有“上传”功能,并且这些团队通常可能不会相互交谈。 .但仍然需要编写混合代码。这就是命名空间的作用。不多也不少。