c++:是否有可能从重载<<的对象中获取std::string ?操作符
C++: Is it possible to get a std::string out of an object that overloads the << operator?
我有一个可以用std::cout << obj
打印到控制台的对象,但我不能从中得到std::string
,因为它似乎没有实现像.string()
方法这样的东西。我想我可能能够使用那个重载运算符来获取所有内容的字符串表示,而不是每次我需要它时都必须实现一个函数来做它,尽管在这个主题上没有发现任何东西,这使我认为这是不可能的。
使用std::ostringstream
。它是一个c++流实现,用于写入字符串。
您可以使用std::ostringstream
。
std::ostringstream os;
os << obj;
std::string result = os.str();
有不同的方法,您可以根据std::ostringstream
手动实现它,或者您可以在boost::lexical_cast
中使用它的预打包版本。对于更复杂的操作,您可以实现一个原位字符串构建器,就像我在这里提供的答案一样(这解决了构建泛型字符串的更复杂的问题,但如果您想检查它是一个简单的泛型解决方案)。
似乎链接的问题已从StackOverflow中删除,所以我将提供基本的骨架。首先要考虑的是我们想要使用的就地字符串构造器,它基本上是避免使用create不必要的对象:
void f( std::string const & x );
f( make_string() << "Hello " << name << ", your are " << age << " years old." );
要实现这一点,make_string()
必须提供一个对象,该对象能够为不同的类型利用已经存在的operator<<
。整个表达式必须转换为std::string
。基本实现相当简单:
class make_string {
std::ostringstream buffer;
public:
template <typename T>
make_string& operator<<( T const & obj ) {
buffer << obj;
return *this;
}
operator std::string() const {
return buffer.str();
}
};
这用最少的代码处理了大部分的实现。它有一些缺点,例如它不接受操纵符 (make_string() << std::hex << 30
),为此您必须提供额外的重载来接受操纵符(函数指针)。这个实现还有一些小问题,其中大部分可以通过添加额外的重载来解决,但是上面的基本实现对于大多数常规情况已经足够了。
- 如何获取std::result_of函数的返回类型
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 从返回 std::optional of std::vector 的函数中获取结果到调用方
- 如何在C++中获取 std::u8string 的正确长度?
- 从组件的 std::type_index 获取派生最多的类型
- std::cin 从控制台获取两种不同的变量类型,'storing'以后使用第二种类型?
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- ostream 运算符<< 为获取 STL 容器而过载,传递 std::string 会破坏它?
- 在 std::variant 中按类型获取索引
- 获取 std::函数以推断按引用传递/按值传递
- 如何获取 std::filesystem::p ath 中的最后一个目录?
- 如何获取两个 std::map 的公钥?
- 如何使用 std::invoke_result_t 获取函数的返回类型
- 在不使用模板的情况下获取 std::array 引用
- 我可以对 std::array 使用自定义分配器来获取安全加密密钥吗?
- 获取未知分段错误"(地址)在 std::__cxx11::basic_string<char, std::char_traits<char>,..., std::分配器<cha
- 通过 Ctypes 将 std:vector 从 C++ 传递到 Python:获取无意义的值
- 在瓦尔格林德的泄漏摘要中使用 std::ios::sync_with_stdio(fasle) 打印时获取"still reachable"
- 是否可以使用 std::文件系统获取根名称列表?
- 如何使 std::istream 从键盘获取输入(如 std::cin)?