c++ - 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
}
谢谢
解决方案
这是解决方案,您不是用运算符引用对象,而是引用类类型。您需要创建该类型的对象才能将 << 与它一起使用。
#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; }
推荐阅读
- android - GCM:又一个 BIND_JOB_SERVICE 权限错误——IntentService 到 JobIntentService
- javascript - mustache-express - 为 mustache 创建一个局部子目录
- angular - 当我刷新页面时,我得到两个响应
- python - Python MSS - 使屏幕截图文件大小更小还是 jpg?
- ansible - 来自文件的ansible列表作为变量
- c# - 运行 MS ACCESS 宏的 C# 互操作错误
- android - 无法使用 Firebase 数据填充 RecyclerView 适配器
- javascript - 带有下拉列表的 Node JS 交互式图库
- visual-studio - 使用 nuget 包构建问题
- javascript - 什么将形状和 jQuery 属性添加到我的锚标记?