V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
huanyingch01
V2EX  ›  问与答

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

  •  
  •   huanyingch01 · 2017-10-30 12:26:42 +08:00 · 2349 次点击
    这是一个创建于 2614 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    7 条回复    2017-10-30 14:10:31 +08:00
    huanyingch01
        1
    huanyingch01  
    OP
       2017-10-30 12:27:32 +08:00
    环境 vs2015
    gulucn
        2
    gulucn  
       2017-10-30 12:36:01 +08:00
    set 里面的值应该是不能变化的,因为其实调用的是
    CBuffer& operator<<(T &val)
    这个函数吧, T 为 const std::string
    wevsty
        3
    wevsty  
       2017-10-30 12:45:29 +08:00
    @gulucn 正解
    jlsk
        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;
    }
    huanyingch01
        5
    huanyingch01  
    OP
       2017-10-30 12:59:32 +08:00
    @gulucn 谢谢,确实是这样。
    huanyingch01
        6
    huanyingch01  
    OP
       2017-10-30 13:05:52 +08:00
    @jlsk 是的,3q。
    gnaggnoyil
        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."
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4140 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 141ms · UTC 05:26 · PVG 13:26 · LAX 21:26 · JFK 00:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.