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
。两者都感觉有点不对,因为人们希望标准库有这样一个基本的东西,而且基本的东西往往很难实现:)
下面是我的问题:
min
重载之后,假设这在C++11中成为一个问题,对吗?所以C++11打破了依赖显式实例化的std::min
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出现错误。