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