我有一个 C++ 对象 (boost::format
),它有一个返回 std::string
的 str()
函数。
所以当我需要格式化的 C 字符串时,我需要这样写:
(boost::format("%1% %2%") % "1" % "2").str().c_str()
我发现它相当冗长,而且我非常需要它。我想创建一个派生类,它有一个 operator char*
并且会像这样工作(Ch = char 或 wchar_t):
operator Ch const* () const
{
return str().c_str();
}
当然,str()
返回的字符串在函数返回时被释放,并且没有返回有效的 C 字符串。
有什么解决方法吗?
变通方法需要创建一个只要周围函数调用就存在的字符串:
lib_function((boost::format("%1% %2%") % "1" % "2").str().c_str());
// can be deallocated here
最佳答案
最明显的解决方案是定义一个包含
std::string
,并隐式转换为 char const*
。
像这样的东西:
class ToPlainC
{
std::string myValue
public:
ToPlainC( boost::format const& fmt )
: myValue( fmt.str() )
{
}
operator char const*() const
{
return myValue.c_str();
}
};
可以使用:
lib_function( ToPlainC( boost::format( "%1% %2%" ) % "1" % "2" ) );
这种隐式转换通常不是一个好主意,但如果 你很好地记录了这个类,它应该只用于 这种特殊情况,我认为这是可以接受的。
编辑:
我想到鼓励只使用这个类作为 一个临时的,在这个特定的场景中,你可以命名它 使用通常用于函数的命名约定,以及 不是你上课用的那些;然后用户将拥有 给人的印象是他正在使用一个功能,而且它会很突出 如果他不使用它,就像拇指酸痛一样。
关于C++ 变量生命周期——需要变通方法来返回临时变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23365156/