我现在看到另一个天真的C++代码,使用sprintf将C内置函数附加到字符数组中,我想够了。
我可以提供简单、轻量级、追加和非格式化函数给std::string,但由于它将被检入团队的公共代码,我希望它是完美的,所以我需要一些关于这个特性接口的建议(即不是实际实现方面的建议)。
以下可能是可能的(我没有测试过,这只是一种预感):
1. 重载"+="运算符(可能在std或全局命名空间之外) 2. 重载"<< "运算符(同样,在另一个命名空间中) 3. 提供非运算符非成员函数(我猜,同样在另一个命名空间中) 4. 我没有看到的另一个简单解决方案?
每种解决方案的优缺点是什么(我更喜欢“+=”,甚至是“<<”)?
我可以提供简单、轻量级、追加和非格式化函数给std::string,但由于它将被检入团队的公共代码,我希望它是完美的,所以我需要一些关于这个特性接口的建议(即不是实际实现方面的建议)。
以下可能是可能的(我没有测试过,这只是一种预感):
1. 重载"+="运算符(可能在std或全局命名空间之外) 2. 重载"<< "运算符(同样,在另一个命名空间中) 3. 提供非运算符非成员函数(我猜,同样在另一个命名空间中) 4. 我没有看到的另一个简单解决方案?
每种解决方案的优缺点是什么(我更喜欢“+=”,甚至是“<<”)?
笔记
- 关键不在于格式。如果有人需要格式化,C++流是很好的选择。我只想要简单、轻量级的一句话/函数调用追加。
- 使用另一个命名空间是因为我们没有权限向std命名空间添加代码,而且我不想污染全局命名空间,所以,是的,我猜用户必须添加
using namespace SomeNamespace;
就像对于<utility>
的rel_ops命名空间一样) - 我正在使用
std::string
它本身不能处理除了自身、char
和char *
之外的其他类型。 我想扩展它来处理其他简单类型。 - 使用stringstream在代码方面太重(声明流,追加,然后检索
.str()
将其放入字符串中等等),我最不想要的是一个语法糖式的内联函数在每次调用时实例化一个stringstream)。正如下面的示例中所示,stringstream解决方案太冗长了:
.
// sprintf-like code with a char[] buffer:
sprintf(buffer, "%d", myDouble) ;
// stream-like code with a std::string buffer:
std::stringstream str ;
str << myDouble ;
buffer = str.str() ;
// example of desired code with a std::string buffer:
buffer += myDouble ;
std::string
?它具备了你所需的一切,而且更加强大。 - Björn Pollexstd::string
、char
或char *
之外的其他类型,我需要使用std::stringstream
。我添加了一条注释以澄清这一点。 - paercebalstd::string
。我添加了一个注释来澄清。 - paercebalstd::string & operator+=(std::string &, int)
吗?这听起来不是一个好主意。你考虑过使用boost::lexical_cast
吗?虽然我猜它内部使用了stringstream
,所以可能不符合你的要求。 - Björn Pollex