在cppreference中,可以找到以下文本:
内联命名空间的每个成员都可以部分特化、显式实例化或显式特化,就好像它是封闭命名空间的成员一样。
注意:关于特化的规则允许库版本控制:库模板的不同实现可以在不同的内联命名空间中定义,同时仍然允许用户使用主模板的显式特化来扩展父命名空间。
这些陈述意味着什么?有人可以通过一个简单的例子来解释吗?
在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