2012-07-24 26 views
18

Estoy tratando de combinar std::accumulate con std::min. Algo como esto (no compilará):¿Es posible usar std :: accumulate con std :: min?

vector<int> V{2,1,3}; 
cout << accumulate(V.begin()+1, V.end(), V.front(), std::min<int>); 

¿Es posible? ¿Es posible prescindir del functor de contenedor de escritura para std::min?
sé que puedo hacer esto con lambdas:

vector<int> V{2,1,3}; 
cout << std::accumulate(
    V.begin()+1, V.end(), 
    V.front(), 
    [](int a,int b){ return min(a,b);} 
); 

y sé que no es std::min_element. No estoy tratando de encontrar el elemento mínimo, necesito combinar std::accumulate con std::min (o ::min) para mi biblioteca que permite la función de programación como expresiones en C++.

Respuesta

19

El problema es que hay several overloads of the min function:

template <class T> const T& min(const T& a, const T& b); 

template <class T, class BinaryPredicate> 
const T& min(const T& a, const T& b, BinaryPredicate comp); 

Por lo tanto, su código es ambiguo, el compilador no sabe qué elegir sobrecargue. Se puede afirmar que uno desea mediante el uso de un puntero de función intermedia:

#include <algorithm> 
#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<int> V{2,1,3}; 
    int const & (*min) (int const &, int const &) = std::min<int>; 
    std::cout << std::accumulate(V.begin() + 1, V.end(), V.front(), min); 
} 
+2

Se podría utilizar un elenco muy feo '(const int & (*) (const int &, const int &)) std :: min '. –

+3

Me gusta más la versión lambda. – moooeeeep

+4

@JesseGood: ¿no tienes 'static_cast'? : \ – Mehrdad

Cuestiones relacionadas