C++变量生存期 -- 需要解决方法才能临时返回
C++ variable lifetime -- need workaround to return temporary
我有一个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" ) );
这种隐式转换通常不是一个好主意,但如果你很好地记录了这个类,它应该只用于这种特殊情况,我认为是可以接受的。
编辑:
我突然想到,鼓励只将此类用作临时的,在这个特定场景中,你可以命名它使用通常用于函数的命名约定,以及不是你用于上课的那些;然后,用户将拥有印象是他正在使用一个函数,它会突出就像拇指酸痛,如果他不这样做的话。
在堆栈上返回一个 std::string。这是一个额外的副本,所以如果性能很重要,这是一个坏主意,但它可以消除大部分冗余类型。
您可以定义如下所示的结构:
struct my_str
{
const std::string &tmp;
my_str(const boost::format &tmp) : tmp( tmp.str() ) {}
operator const char *() const { return tmp.c_str(); }
};
你可以这样称呼它
lib_function ( my_str(boost::format("%1% %2%") % "1" % "2") );
如果您担心引用会悬而未决,请阅读本文。
相关文章:
- 从父类方法返回子类对象
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 让bool方法返回其他整数
- 不能将方法返回的值用于另一个方法
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- 从私有成员变量的成员方法返回unique_ptr
- 我的模板类方法返回错误类型?
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 方法错误"not all control paths return a value"和方法不返回值
- GRPC C++ TLS 客户端 grpc::SslCredentials() 方法不返回
- 我无法使用C++指针指向类方法返回的 std::vector
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- EnQueue 方法在循环队列中未正确返回C++?
- 应用于const和非const对象的引用返回方法
- 在vc++ PPL中,如何创建一个同步返回的任务返回方法
- 为什么从浮点返回方法返回双精度不会在 c++ 中导致任何错误/警告
- 这个返回方法叫什么?