
// buffer
#ifndef __Buffer_H__ #define __Buffer_H__ #include <iostream> #include <vector> #include <list> #include <deque> #include <map> #include <set> class CBuffer { public: CBuffer() { } ~CBuffer() { } template <class T> CBuffer& operator<<(T &val) { std::cout << "11111" << std::endl; return *this; } CBuffer& operator<<(std::string &val) { std::cout << "22222" << std::endl; return *this; } template <class T> CBuffer& operator<<(std::list<T> &val) { auto iter = val.begin(); while (iter != val.end()) { *this << (*iter++); } return *this; } template <class T> CBuffer& operator<<(std::deque<T> &val) { auto iter = val.begin(); while (iter != val.end()) { *this << (*iter++); } return *this; } template <class T> CBuffer& operator<<(std::vector<T> &val) { for (size_t i = 0; i < val.size(); ++i) { *this << val[i]; } return *this; } template <class T> CBuffer& operator<<(std::set<T> &val) { auto iter = val.begin(); while (iter != val.end()) { // static_cast<T> 不加上这个无法正确重载,原因未知 *this << (*iter++); } return *this; } }; #endif // main
#include <iostream> #include "Buffer.h" using namespace std; int main() { CBuffer buf; std::set<std::string> a1 = { "aaa"}; std::vector<std::string> a2 = { "aaa"}; std::list<std::string> a3 = { "aaa" }; std::deque<std::string> a4 = { "aaa" }; buf << a1 << a2 << a3 << a4; system("pause"); return 0; } 输出
11111 22222 22222 22222 set 的<<重载调用与其他 vector,list,deque 不同。 不解!!!
1 huanyingch01 OP 环境 vs2015 |
2 gulucn 2017-10-30 12:36:01 +08:00 set 里面的值应该是不能变化的,因为其实调用的是 CBuffer& operator<<(T &val) 这个函数吧, T 为 const std::string |
4 jlsk 2017-10-30 12:55:54 +08:00 2L+1 一个 const 就会造成是不同的类型 再加个重载就知道了 CBuffer& operator<<(const std::string &val) { std::cout << "33333" << std::endl; return *this; } |
5 huanyingch01 OP @gulucn 谢谢,确实是这样。 |
6 huanyingch01 OP @jlsk 是的,3q。 |
7 gnaggnoyil 2017-10-30 14:10:31 +08:00 这算是个老的 Defect Reports 了……见 https://cplusplus.github.io/LWG/issue103 所以现在标准里在[associative.reqmts]这一节直接有这么一句话:"For associative containers where the value type is the same as the key type, both iterator and const_iterator are constant iterators." |