gpt4 book ai didi

c++ - 在单个语句中将临时字符串流转换为 c_str()

转载 作者:IT老高 更新时间:2023-10-28 22:37:41 27 4
gpt4 key购买 nike

考虑以下函数:

void f(const char* str);

假设我想使用 stringstream 生成一个字符串并将其传递给这个函数。如果我想在一个语句中做到这一点,我可能会尝试:

f((std::ostringstream() << "Value: " << 5).str().c_str()); // error

这给出了一个错误:“str()”不是“basic_ostream”的成员。好的,所以 operator<< 正在返回 ostream 而不是 ostringstream - 将其转换回 ostringstream 怎么样?

1) 这个类型转换安全吗?

f(static_cast<std::ostringstream&>(std::ostringstream() << "Value: " << 5).str().c_str()); // incorrect output

现在,对于 operator<<("Value: ") 调用,它实际上是在调用 ostream 的 operator<<(void*) 并打印一个十六进制地址。错了,我要文字。

2) 为什么临时 std::ostringstream() 上的 operator<< 调用 ostream 运算符?肯定是临时的类型是 'ostringstream' 而不是 'ostream'?

我也可以强制执行正确的运算符(operator)调用!

f(static_cast<std::ostringstream&>(static_cast<std::ostringstream&>(std::ostringstream()) << "Value: " << 5).str().c_str());

这似乎可行并将“值:5”传递给 f()。

3) 我现在是否依赖未定义的行为? Actor 阵容看起来很不寻常。


我知道最好的选择是这样的:

std::ostringstream ss;
ss << "Value: " << 5;
f(ss.str().c_str());

...但我对在一行中执行此操作的行为感兴趣。假设有人想做一个(可疑的)宏:

#define make_temporary_cstr(x) (static_cast<std::ostringstream&>(static_cast<std::ostringstream&>(std::ostringstream()) << x).str().c_str())

// ...

f(make_temporary_cstr("Value: " << 5));

这个功能会如预期的那样吗?

最佳答案

您不能将临时流转换为 std::ostringstream& .它格式错误(编译器必须告诉您它是错误的)。不过,以下方法可以做到:

f(static_cast<std::ostringstream&>(
std::ostringstream().seekp(0) << "Value: " << 5).str().c_str());

那当然是丑陋的。但它显示了它是如何工作的。 seekp是返回 std::ostream& 的成员函数.一般地写这个可能会更好

template<typename T>
struct lval { T t; T &getlval() { return t; } };

f(static_cast<std::ostringstream&>(
lval<std::ostringstream>().getlval() << "Value: " << 5).str().c_str());

没有任何东西它需要void*的原因, 是因为 operator<<是一个成员函数。 operator<<这需要 char const*不是。

关于c++ - 在单个语句中将临时字符串流转换为 c_str(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2433071/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com