首页 > 解决方案 > std::cout 的简约重新实现

问题描述

你能帮我重新实现 std::cout 的最基本功能吗?

要求:

1) 可以包含 C 标准头文件,但不能使用 C++ 库。例如 stdio.h 可用于 printf 函数。

2)如果它只适用于一种类型也没关系,让我们使用“char *”。目标是找到最简短的实现。

3)以下行应该在没有任何修改的情况下工作(应该使用命名空间):

std::cout << "Hello World!\n";

4) 一切都应该在一个文件中,包括 main() 方法

编辑:

这是我拥有的代码,它会导致编译错误:

#include <stdio.h>

namespace std {
  class cout {
    public:
      void operator << (char* s) {
        printf("%s", s);
      }
  };
}

int main() {
  std::cout << "Hello World!\n"; // Compilation error: expected an identifier
}

谢谢

标签: c++cnamespacesoperator-overloading

解决方案


这是解决方案,您不是用运算符引用对象,而是引用类类型。您需要创建该类型的对象才能将 << 与它一起使用。

#include <stdio.h>

//don't ever use std namespace
namespace test {
    class base_cout {
    public:
        void operator << (const char const* s) {
            printf("%s",s);
        }
    };

    // This should be extern if you want to use it outside a single file.
    base_cout cout;
}

int main() {
    test::cout << "Hello World\n";
}

这就是 iostream 标头中的 cout : namespace std { extern ostream __declspec(dllexport) cout; }


推荐阅读