c++ - 寻求对内联命名空间的澄清
问题描述
在cppreference中,可以找到以下文本:
内联命名空间的每个成员都可以部分特化、显式实例化或显式特化,就好像它是封闭命名空间的成员一样。
注意:关于特化的规则允许库版本控制:库模板的不同实现可以在不同的内联命名空间中定义,同时仍然允许用户使用主模板的显式特化来扩展父命名空间。
这些陈述意味着什么?有人可以通过一个简单的例子来解释吗?
解决方案
考虑一个愚蠢的例子:
#include <iostream>
namespace foo {
inline namespace v1 {
template <typename T>
void bar(T t) {
(void) t;
std::cout << "Generic bar\n";
}
}
template <>
void bar<int>(int v) {
(void) v;
std::cout << "Specialized bar\n";
}
}
int main() {
foo::bar(12);
foo::v1::bar(12);
foo::bar(12.0);
return 0;
}
如果你运行它,你会得到以下输出:
Specialized bar
Specialized bar
Generic bar
foo::bar
这是因为使用 an调用int
是专门用于 的foo
,即使默认实现存在于foo::v1
.
这个例子没有用,但是考虑一个你想要专门化一个template
函数或class
在一个外部库(包括 stl)中的场景。您不知道是否vector
是std
or的成员std::cxx11
(libc++std::__1
用于许多事情)。由于 aninline namespace
是一种在 API 级别提供版本控制的方法(例如,您更改inline namespace
tov2
并保持不变),这让最终用户可以在不知道dv1
细节的情况下进行专业化。inline
namespace
推荐阅读
- html - 使下拉菜单与导航栏宽度相同
- c# - 在winform应用程序中将vb函数转换为c#
- javascript - 检查 2 个变量是否包含完全相同的文本并使用 jquery 执行操作
- r - 使用 R 中另一列中元素的第一个元素创建一个新的数据框列
- php - 使用 ORM 进行查询并在内部一起使用 (AND) 和 (OR)
- html - 使用默认字体的字体系列
- jquery - CSS 过渡的问题
- javascript - Vue Axios 推送数组未实时更新
- spring - 如何通过调用spring logback中的方法来限制日志记录
- java - Calendar.getInstance 与 TimeZone 与 new Date()