C++ 变量生命周期——需要变通方法来返回临时变量

标签 c++ cstring stdstring object-lifetime boost-format

我有一个 C++ 对象 (boost::format),它有一个返回 std::stringstr() 函数。

所以当我需要格式化的 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/

相关文章:

c++ - 如何迭代修改后的 std::map 值?

c - 如何将 STDIN 字符串设置为特定字符?

c++ - 预分配 std::string 以传递到 WinAPI

mfc - CString 总是以 null 结尾吗?

c++ - std::string::iterator 偏移并返回

c++ - 将(临时?) std::string 传递给使用它来构造需要拷贝的对象的函数的最佳方法是什么?

c++ - C++ 开发人员应了解的有关网络编程的所有知识?

python - Boost-Python C++ 项目构建,如何使用 Python 中的新库?

c++ - float 不准确导致计算错误

c++ - CString 十六进制值转换为字节数组