有没有办法在不污染名称空间的情况下使用boost :: assign运算符?

时间:2011-02-03 22:48:26

标签: c++ boost namespaces operators

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

std::vector tmp;
tmp += "abc","def","asdf","foo","blah","dfkef";

不添加“using namespace boost :: assign;”这会产生错误:

error: no match for 'operator+=' in 'tmp += "abc"'

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

1 个答案:

答案 0 :(得分:13)

您认为它会污染命名空间是错误的: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语句创建一个范围......

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