【问题标题】:Adding types to the std namespace向 std 命名空间添加类型
【发布时间】:2010-09-24 03:54:38
【问题描述】:

是否可以将类型添加到 std 命名空间。例如,我想要一个 TCHAR 友好的字符串,那么下面的可以接受吗?

#include <string>

namespace std
{
    typedef basic_string<TCHAR> tstring;
}

还是应该使用我自己的命名空间?

【问题讨论】:

    标签: c++ stl namespaces


    【解决方案1】:

    只允许专业化。因此,例如,您可以为您的类型专门化 std::numeric_limits。这当然必须发生在命名空间std:: 中。但是您的 typedef 不是专业化的,因此会导致未定义的行为。

    【讨论】:

    • 根据this answerswap 的实现不应该再进入std,因为使用swap 的算法应该依赖于参数相关的查找。
    • @MvG 答案是正确的。我的例子不是也不好。我会替换它。
    • 为什么numeric_limitsswap在这方面有什么不同?
    • @DanNissenbaum 我不知道swap 的规则。如果不允许对其进行专门化,那可能是因为 ADL 提供了更好的替代方案
    • @Dan numeric_limits 不是函数模板,因此不适用。你可以写template&lt;typename T&gt; struct numeric_limits&lt;MyNumberWrapper&lt;T&gt;&gt; { ... }; 很好。
    【解决方案2】:

    不...命名空间的部分意义在于防止升级时发生名称冲突。

    如果您将内容添加到 std 命名空间,那么如果他们决定添加具有相同名称的内容,您的代码可能会在库的下一个版本中中断。

    【讨论】:

    • 这也违反了标准,afaik。 std 命名空间是神圣的。 (除了现有标准函数的特化):)
    【解决方案3】:

    [C++11: 17.6.4.2.1/1]: 除非另有说明,否则如果 C++ 程序将声明或定义添加到命名空间 std 或命名空间 std 内的命名空间,则其行为未定义。只有当声明依赖于用户定义的类型并且特化满足原始模板的标准库要求并且没有明确禁止时,程序才能将任何标准库模板的模板特化添加到命名空间 std。

    【讨论】:

      【解决方案4】:

      您应该使用自己的命名空间,因为将代码添加到标准库只会让那些在线查找有关该添加的信息的用户感到困惑。

      std 中的所有内容都应该只是标准库,没有别的。

      【讨论】:

      • 我不相信这会让用户感到困惑——事实上他们可能期望 std::basic_string 类型出现在 std.我认为这是一个艰难的决定。
      • 不,克莱姆是正确的。您不应向 std 命名空间添加任何内容。用户可能期望 basic_string 在std 中,但它不是std 库的一部分,他们不会在给定std 实现的已发布文档中找到任何内容。正确的做法是使用自己的ns。
      • 我必须查一下这个。 basic_string 实际上被定义为 ISO/IEC 14882:1998 第 384 页上的 std 命名空间的一部分。
      【解决方案5】:

      官方称这是“未定义的行为”,可能会发生各种令人讨厌的事情。

      在实践中,它可以正常工作,但您仍然不应该这样做。除了让人们认为编译器提供了某些东西之外,它还能给你带来什么?

      【讨论】:

        【解决方案6】:

        这是一个有趣的问题,因为它完全取决于项目和工程师接受的编码标准。

        对于一个程序员来说,为什么不……小心点。

        对于团队,制定标准...

        对于跨平台项目,该死的。

        否则,nawdawg。

        【讨论】:

          【解决方案7】:

          我完全同意其他答案,即您应该将类​​型放在自己的命名空间中以避免不幸的名称冲突。

          但是,我想明确指出有时,您可以(并且应该!)在 std 命名空间中添加内容。例如 std::swap 方法的模板特化就是这种情况,它用于提供交换对象的统一方式。有关此事的更多信息,您可以阅读non-throwing swap idiom

          【讨论】:

            猜你喜欢
            • 2013-05-27
            • 2012-11-08
            • 1970-01-01
            • 2014-07-20
            • 2014-02-07
            • 2011-08-22
            • 1970-01-01
            • 2012-12-20
            • 1970-01-01
            相关资源
            最近更新 更多