您将如何编写一个库,当包含它时,它会使任何*现有STL容器的<<运算符超载?
一个自我强加的要求是它不能包含任何容器的头文件.这将不必要地膨胀最终的可执行文件.在我希望使用的容器之后包含此标头更有意义.这种限制意味着使用templates或macros.
我正在寻找建议和指示,所以,请不要发布能够做到这一点的完全正常工作的代码!自己实现这一点是学习过程的一部分.代码片段的小片段可以展示某些东西是如何工作的.
到目前为止我做了什么:
我<<为每个具有不同模板签名的容器重载了运算符.我遇到的问题是,有些容器具有相同数量的模板参数,但有些容器包含std::pair-s,其他容器single values.更确切地说,这是std::map&std::multimapvs std::unordered_set&的情况std::unordered_multiset.
这次碰撞迫使我要么实现其中一对的非模板版本,要么想出一种区分std::pair-s和-s 的方法single values.不过,我真的不知道如何去做第二个.我之所以不直接" 怎么做 " 的原因是我开始相信这可以通过更好的整体设计来完全避免.
先感谢您!
什么对我有用:
operator<<的std::pairoperator<<使用不同的模板参数重载每个STL容器
注意:
template <typename T1>并且template <typename T1, typename T2>是不同的template <typename T1, typename T2>并且template <typename T1, size_t T2>是 不同的template …
我正在学习NASM大学课程.我想链接C运行时库用ld,但我似乎无法环绕它我的头.我有一64 bit台Linux Mint已安装的机器.
我感到困惑的原因是 - 据我所知 - 而不是链接C运行时,gcc将您需要的东西复制到程序中.我可能错了,所以请不要犹豫,纠正我.
到目前为止我所做的是将其链接起来gcc.产生的机器代码,我无法跟随虽然乱七八糟,甚至像换了一个小程序rax用rbx,这不是学习的目的,伟大的.(请注意该程序有效.)
我不确定它是否相关,但这些是我用来编译和链接的命令:
# compilation
nasm -f elf64 swap.asm
# gcc
gcc -o swap swap.o
# ld, no c runtime
ld -s -o swap swap.o
Run Code Online (Sandbox Code Playgroud)
先感谢您!
结论:
既然我对这个问题有了正确的答案,我想提一下以下几点.glibc动态链接可以像Z boson的答案(对于64位系统)那样完成.如果你想静态地做,请按照这个链接(我从Z boson的回答中重新发布).
这是Jester发布的一篇关于程序如何从linux开始的文章.
要查看gcc链接.o-s的内容,请尝试以下命令:gcc -v -o swap swap.o.请注意,'v'代表'详细'. …