我正在创建一个自定义C++ STL容器库,并且我有一个问题涉及代码大小和执行时间的有效插入(请尽可能多地复制)。
我想编写一个可以从其他类似插入函数调用的插入函数(_find / erase同样适用)(_ insert_unique),并且还保留其语义
例如 :

    std::pair<iterator, bool> insert(const value_type &val) {
        return _insert_unique(val);
    }

    std::pair<iterator, bool> insert(value_type &&val) {
        return _insert_unique(std::move(val));
    }

    template <class... Args>
    std::pair<iterator, bool> emplace(Args&&... args) {
       return _insert_unique(std::forward<Args>(args)...);
    }

通过保留语义,我的意思是该函数应避免在参数为value_type &&时进行复制,或者如果键中不存在键,则避免在emplace()中构造键(我知道C++ 11 emplace ()版本需要使用“forward_as_tuple”和“piecewise_construct”来解决此问题,并为此目的引入了新函数try_emplace())。
所以我的问题是,如果不为每个类似插入的函数编写重复的代码,是否可以实现我想要的功能。

最佳答案

如果我理解正确,则您正在尝试保留参数的值类别
有两种方法可以做到这一点:

  • 重载:

  • void myFunc(const Object& obj) { handleObject(obj); }
    void myFunc(Object&& obj) { handleObject(std::move(obj)); }
    
  • 转发引用

  • template <typename T>
    void myFunc(T&& obj) { handleObject(std::forward<T>(obj)); }
    
    在第二种情况下,&&用于保留对象值类别的转发引用。
    因此,如果您不想重复功能,则只需使用示例中的转发引用即可:
        template <class... Args>
        std::pair<iterator, bool> emplace(Args&&... args) {
           return _insert_unique(std::forward<Args>(args)...);
        }
    
    希望我不要误会你的问题

    10-07 19:25
    查看更多