gpt4 book ai didi

c++ - 我可以在没有流对象的情况下调用流运算符重载吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:14 25 4
gpt4 key购买 nike

假设我想 throw带有包含有关某个对象的信息的字符串,但对象实现仅对流运算符 ( << ) 进行重载,而不是强制转换为字符串。我想做这样的事情:

throw std::runtime_error("Error, encountered invalid value " + x);

哪里x是具有 ( <<) 重载的类型的实例。但是,上面的方法不起作用,因为 +未重载为与 const char* 兼容的类型.如果x是一个字符串(或可转换为一个字符串)它会起作用,但我必须这样做:

std::stringstream s;
s << "Error, encountered invalid value " << x;
throw std::runtime_error(s.str());

如何在不添加任何重载或自定义函数的情况下获得与第一个示例一样简洁的内容。标准库是否提供了一些有助于解决此问题的功能?

最佳答案

你可以委托(delegate)给一个函数:

template <typename T>
std::string stream(const T& x) {
std::ostringstream ss;
ss << x;
return ss.str();
}

throw std::runtime_error("Error..." + stream(x));

这也是什么 boost::lexical_cast 做:

throw std::runtime_error("Error..." + boost::lexical_cast<std::string>(x));

或者您可以使用临时流,这涉及到自 operator<< 起必须进行转换。通常只返回 basic_ostream<char>& :

throw std::runtime_error(
static_cast<std::ostringstream&&>(std::ostringstream{} << "Error..." << x)
.str() );

或者您可以将该逻辑包装到一个单独的类型中,在流式传输时将结果转换为 string ,为了娱乐:

struct ToStrT {
friend std::string operator<<(std::ostream& os, ToStrT ) {
return static_cast<std::ostringstream&&>(os).str();
}
};

constexpr ToStrT ToStr{};

throw std::runtime_error(std::ostringstream{} << "Error..." << x << ToStr);

关于c++ - 我可以在没有流对象的情况下调用流运算符重载吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30112884/

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