为什么std :: erase(std :: erase_if)不是 可以在任何容器上使用的模板?

问题描述 投票:0回答:1

std::erase(_if)是C ++ 20的一个不错的补充(最终我可以忘记令人讨厌的擦除删除习惯用法),但是有一件事很奇怪:从某种意义上说,它不是通用算法,它仅适用于std ::容器,例如它不能对升压矢量进行操作。

    #include<string>

    #include<vector>

    #include<boost/container/vector.hpp>

    int main() {
        std::string str = " Hello World  !";
        std::erase(str, ' '); // :)
        boost::container::vector<int> vi{1,2};
        std::erase(vi, 2); // :(
    }

我的最佳猜测是,该算法在将概念投票选为标准之前尚处于实验阶段,因此需要大量工作来进行重新设计,或者担心无法正确为其指定概念(即,它将无法正常工作)在某些具有时髦语义的用户定义类型上)。

所以:我的问题是,为什么这不是具有某些Concept(或enable_if)需求/调度(例如地图/设置)的通用算法?

c++ stl c++20 c++-concepts
1个回答
0
投票

此问题在原始提案N4009中回答:

Q10。而不是为每个容器重载delete_if(),您应该提供一个单独的delete_if(Container&,Predicate)函数模板指定对每个容器执行正确的操作?

A10。这样的通用功能模板可以由用户定义容器。没有任何“容器特性”,因此不可能确定用户定义的容器是否是矢量型,列表型,像地图一样的东西。用户定义的容器可以简单地是被拒绝,但是常规功能模板将无法执行与提议的一组特定的重载有什么不同这里。请注意,用户定义容器的作者可以重载在其命名空间中将其容器擦除[_if()]。

TL; DR:因为无法编写这样的“ Concept(或enable_if)要求/调度”。

© www.soinside.com 2019 - 2024. All rights reserved.