// 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." |