继 c++ set 重载无法正确调用,给了一个完整的 demo

2017-10-30 12:26:42 +08:00
 huanyingch01

// 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 不同。 不解!!!

2162 次点击
所在节点    问与答
7 条回复
huanyingch01
2017-10-30 12:27:32 +08:00
环境 vs2015
gulucn
2017-10-30 12:36:01 +08:00
set 里面的值应该是不能变化的,因为其实调用的是
CBuffer& operator<<(T &val)
这个函数吧, T 为 const std::string
wevsty
2017-10-30 12:45:29 +08:00
@gulucn 正解
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;
}
huanyingch01
2017-10-30 12:59:32 +08:00
@gulucn 谢谢,确实是这样。
huanyingch01
2017-10-30 13:05:52 +08:00
@jlsk 是的,3q。
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."

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/401883

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX