C++ 使用'std::min'作为算法参数

C++ 使用'std::min'作为算法参数,c++,c++11,templates,stl,overloading,C++,C++11,Templates,Stl,Overloading,所以我遇到了这个问题:我需要将std::vector的每个元素替换为之前的最小值(包括) 自然地,我会想到std::partial_sum——如果我能将std::min作为BinaryOp传递,它就会完成任务 事实证明,我不能这样做,因为std::min是一个重载函数-它同时适用于int和initializer\u list和partial\u sum模板不能用未知类型实例化 通常这是通过使用一个带有模板化的操作符()的类来解决的,比如std::plus等,但是标准库似乎没有一个用于min和ma

所以我遇到了这个问题:我需要将
std::vector
的每个元素替换为之前的最小值(包括)

自然地,我会想到
std::partial_sum
——如果我能将
std::min
作为
BinaryOp
传递,它就会完成任务

事实证明,我不能这样做,因为
std::min
是一个重载函数-它同时适用于
int
initializer\u list
partial\u sum
模板不能用未知类型实例化

通常这是通过使用一个带有模板化的
操作符()
的类来解决的,比如
std::plus
等,但是标准库似乎没有一个用于
min
max
的类

我觉得我要么必须实现我自己的
T min(T,T)
,这将是
std::min
的一个精确克隆,除了没有
初始值设定项列表
重载,要么实现我自己的
class min
类似于
std::plus
。两者都感觉有点不对,因为人们希望标准库有这样一个基本的东西,而且基本的东西往往很难实现:)

下面是我的问题:

  • 有什么合适的方法来解决这个问题吗?i、 e.不引入新的模糊结构/编写多行代码
  • 在引入
    min
    重载之后,假设这在C++11中成为一个问题,对吗?所以C++11打破了依赖显式实例化的
    std::min
  • 谢谢大家!

    将其包裹在lambda中:

    std::partial_sum(v.begin(), v.end(), v.begin(), [](auto& a, auto& b) {
        return std::min(a, b);
    });
    

    您可以初始化一个指向适当类型的函数变量的指针并传递它,或者显式地传递静态转换

    int& (*min)(int&, int&) = std::min<int>;
    std::partial_sum(v.begin(), v.end(), v.begin(), min);
    
    int&(*min)(int&,int&)=std::min;
    标准:部分和(v.begin(),v.end(),v.begin(),min);
    
    如果上述内容无法编译,请尝试添加常量修饰符:

    const int& (*min)(const int&, const int&) = std::min<int>;
    
    const int&(*min)(const int&,const int&)=std::min;
    
    请记住,在LAMBDA中,这个版本需要C++14 14个参数。Ap31中的两个大编译器(GCC和Clang)支持通过C++代码- STD < /Cord>选项,用C++版本的特定版本构建选项。您可以像
    -std=c++03
    那样使用它来告诉编译器改用c++03标准。通过这样做,你可以很容易地自己检查第二个问题。@Someprogrammerdude很好的观点,看起来是这样的。老实说,这有点愚蠢。很抱歉发布,但是当需要将
    std::min
    用作模板参数时,是否有办法解决此问题,如
    Compare
    in:
    templateclass set
    ?@madhur4127抱歉,刚才注意到你的帖子:)所以在c++20中,我们将让无状态lambda最终在未赋值的上下文中工作,这意味着你将能够使用
    decltype([](ta,tb){return min(a,b);})
    作为模板参数作为一个一般规则,永远不要使用函数的地址,除非您使用的API明确表示您可以这样做。否则,函数API只会告诉您如何调用函数,实现可以通过多个重载自由实现函数,即使重载集的成员都没有公开的签名。@KerrekSB这看起来像是我一直在寻找的答案(无论如何是第二部分),谢谢!我认为该标准实际上是关于成员函数的,但它真正应该是一个一般原则。实际上,您甚至可以动态地转换它,但可读性会受到影响。您确定
    int&(*min)(int&,int&)=std::min编译?我在将函数“min”转换为类型“int&(*)(int&,int&)时未得到匹配项。
    gcc 9.2出现错误。