【问题标题】:Is there a way to use boost::assign operators without polluting namespace?有没有办法在不污染命名空间的情况下使用 boost::assign 运算符?
【发布时间】:2011-02-03 22:48:25
【问题描述】:

我尽量避免在我的 C++ 中“使用命名空间”以避免污染我的命名空间。但是,我想利用 boost 赋值运算符来做这样的事情:

标准::向量 tmp; tmp += "abc","def","asdf","foo","blah","dfkef";

不添加“使用命名空间 boost::assign;”这会产生错误:

错误:'tmp += "abc"' 中的 'operator+=' 不匹配

有没有办法在不使用命名空间的情况下在 boost 中使用这些运算符?

【问题讨论】:

    标签: c++ boost namespaces operators


    【解决方案1】:

    您的假设是错误的,它会污染命名空间:using namespace 功能正是为这种用途而创建的。

    它只会“污染”声明using namespace的范围,在这种情况下,好处(使用运算符)远远大于缺点(这种“污染”与范围)。

    例如,您可以:

    void foo()
    {
       // no symbol of boost::assign is polluting here
    
       std::vector tmp;
    
       {
          using namespace boost::assign ;
          // brings in this scope all the symbols of boost::assign
          tmp += "abc","def","asdf","foo","blah","dfkef";
       }
    
       // no symbol of boost::assign is polluting here
    }
    

    您应该在using namespace 带来的语法糖和它可能带来的潜在污染之间做出平衡。

    一个很好的折衷办法是将其限制在一个函数体中,或者,如果你和我一样偏执,那么只为这个 using 语句创建一个范围......

    作为一个有趣的旁注,最糟糕的解决方案是将 using 放在带有导出符号的公共标头中。

    【讨论】:

    • 我认为如果你的函数足够大,可以为using 语句引入范围,那么你的函数应该被拆分或者你的标准太严格,而 using 语句对函数的其余部分,因此引入范围没有意义。
    • @GMan:我想你是对的。这就是为什么我写了“一个好的妥协可能是将它限制为一个函数体”以及为什么编写一个范围被限定为“偏执狂”... ^_^ ....
    • 你是对的。我查看了分配的头文件,看起来定义非常小,我想部分是为了方便以这种方式使用命名空间。
    猜你喜欢
    • 2021-09-30
    • 1970-01-01
    • 2016-03-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    相关资源
    最近更新 更多