3

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

template <typename T>
namespace basic_foo {
    struct str {
        T value;
    };
}

basic_foo<char>::str s1;
namespace foo = basic_foo<char>;
foo::str s2;

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

提前致谢。

4

4 回答 4

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;
于 2012-07-06T16:45:37.540 回答
5

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

template<typename T>
struct basic_foo
{
    struct str
    {
        T value;
    };
};

typedef basic_foo<char> foo;
foo::str s1;

您也可以使用class而不是,但在这种情况下struct您必须记住 about 。public:

于 2012-07-06T16:45:48.493 回答
1

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

于 2012-07-06T16:46:15.567 回答
0

其他答案解释了如何执行您可能想要的操作。但听起来您对命名空间的用途与它的真正设计用途有不同的想法。

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

openssl_create
openssl_connect

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

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

我还应该注意,在组织内,名称空间用于应用程序、产品或团队级别 - 例如,Google Drive 可能像 Google Mail 一样在某处具有“上传”功能,并且这些团队通常可能不会相互交谈。 .但仍然需要编写混合代码。这就是命名空间的作用。不多也不少。

于 2012-07-06T19:26:48.440 回答