C++:有没有办法创建模板化命名空间
C++: Is there a way to create a templated namespace?
我想知道是否可以执行以下操作:
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 一样在某处具有"上传"功能,这些团队通常可能不会相互交谈...... 但仍然需要编写混合代码。这就是命名空间的作用。 仅此而已,仅此而已。
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 是否可以将函数导入命名空间,但不能导出它?
- C++ C++类中的命名空间降级
- 如何使用 soong 命名空间来有条件地编译模块
- 使用 Clang++ 有没有办法将文件作为命名空间等包含?
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何通过命名空间调用非静态方法
- 在命名空间名称之前加上 :: 是什么意思?