c++ - 可以将特化注入(inject) std 命名空间吗?

标签 c++ c++11 template-specialization

在此article on defining your own extensions to ::std::error_code作者推荐这段代码:

namespace std
{
  template <>
  struct is_error_code_enum<http_error>
    : public true_type {};
}

为了启用从您自己的错误常量到系统错误类型的转换。

这合理吗?将东西放入 std 命名空间总是让我感到紧张。有没有更好的方法来实现目标?如果做不到这一切,标准中是否有一部分说这样做总是可以的?

最佳答案

是的,现有 std 类型的特化(对于用户定义的类型)是 only 允许放入 std 命名空间的东西,只要特化符合原始模板的要求。

参见 C++0x 草案中的 17.6.4.2.1。

当然,新类型、函数重载和其他任何东西都是被禁止的。但允许对现有模板进行专门化。

关于c++ - 可以将特化注入(inject) std 命名空间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6954377/

相关文章:

c++ - 在 C++ 中区分具有不同标点符号的相同字符串

c++ - 常规转换与 static_cast 与 dynamic_cast

c++ - move 到 lambda 捕获 C++11

c++ - 不支持 SFML 垂直同步

c++ - 如何实现这样的模板特化?

c++ - 为什么我可以部分特化但不能完全特化 C++ 中的成员模板?

c++11 - 带有部分模板特化的 static_assert

C++ - 代码可以在我的机器上运行,但不能在我的学校服务器上运行 ( cin.getline( ) )

c++ - COM : convert 'const GUID*' to const wchar_t*

C++11 无法将 std::condition_variable::wait 从 'void' 转换为 'bool'