C++ {fmt}等价于cout.rdbuf?

C++ {fmt}等价于cout.rdbuf?,c++,fmt,C++,Fmt,我有一个单元测试,通过读取函数发送的缓冲区来验证函数: template <typename Manifold> void print_manifold(Manifold const& manifold) try { std::cout << "Manifold has " << manifold.N0() << " vertices and " << manifold.N1() << "

我有一个单元测试,通过读取函数发送的缓冲区来验证函数:

template <typename Manifold>
void print_manifold(Manifold const& manifold)
try
{
  std::cout << "Manifold has " << manifold.N0() << " vertices and "
            << manifold.N1() << " edges and " << manifold.N2() << " faces and "
            << manifold.N3() << " simplices.\n";
  // fmt::print(
  //    "Manifold has {} vertices and {} edges and {} faces and {}
  //    simplices.\n", manifold.N0(), manifold.N1(), manifold.N2(),
  //    manifold.N3());
}
catch (...)
{
  std::cerr << "print_manifold() went wrong ...\n";
  throw;
}  // print_manifold
是否有方法捕获进入标准输出的
fmt::print
生成的输出


当我注释掉
cout
代码并取消注释
fmt
代码时,我得到了
cout以前的实例生成的缓冲区,这更像是一个C stdio而不是{fmt}问题,但是您可以将
stdout
重定向到管道,并按照对的回答中所述从中读取输出。虽然这不是一个很好的单元测试,因为它取决于全局状态,但您当前的测试也有同样的问题

SCENARIO("Printing results", "[utility]")
{
  // redirect std::cout
  stringstream buffer;
  cout.rdbuf(buffer.rdbuf());
  GIVEN("A Manifold3")
  {
    Manifold3 const manifold(640, 4);
    WHEN("We want to print statistics on a manifold.")
    {
      THEN("Statistics are successfully printed.")
      {
        print_manifold(manifold);
        CHECK_THAT(buffer.str(), Catch::Contains("Manifold has"));
      }
    }
}