El estándar C++ 1x ha dejado de utilizar las antiguas funciones de enlace STL a favor del más universal std::bind
. Sin embargo, parece que std::not1
y std::not2
no están en desuso en favor de un std::not_
universal o algo así. La realidad es que la parte <functional>
de la STL, antes de C++ 1x, era realmente engorrosa para trabajar debido a 1) la falta de lambdas, 2) el hecho de que los enlazadores y los funtores de negación requerían un tipo anidado 0dec, lo que significa no podían trabajar con funciones ordinarias, y 3) la falta de plantillas variadic necesitó funciones de enlace y negación separadas dependiendo del número de argumentos.Negación unaria y binaria
C++ 1x cambió todo esto, mejorando drásticamente la utilidad de <functional>
. Pero por alguna razón, C++ 1x parece haber mejorado todo exceptostd::not1
y std::not2
. En realidad, sería bueno tener un estándar de función universal negate
, como:
template <class F>
class negation
{
public:
negation(F f) : m_functor(f) { }
template <class... Args>
bool operator() (Args&&... args) const
{
return (!m_functor(args...));
}
private:
F m_functor;
};
template <class F>
inline negation<F> not_(F f)
{
return negation<F>(f);
}
Este sería, por supuesto despreciar std::not1
y std::not2
de la misma manera quedaron en desuso las viejas carpetas.
Pregunta (s): 1) He examinado el borrador de C++ 1x, y no veo ninguna mención de una función universal negate
. ¿Lo extrañé? 2) ¿Hay alguna razón convincente por la que agregaron un bind
universal y desaprobaron los antiguos enlazadores, pero no hicieron lo mismo para las funciones de negación?
¿Es '' incluso útil, ahora que tenemos lambdas? –
@Marcelo, seguro que sí. 'std :: bind' es muy útil. – Channel72
¿Cómo es eso? @ Comentario de Howard a [respuesta de DeadMG] (http://stackoverflow.com/questions/5567342/unary-and-binary-negation/5567712#5567712) enlaces a [otra respuesta] (http://stackoverflow.com/questions/ 1930903/bind-vs-lambda/4581747 # 4581747) que argumenta a bind, porque las lambdas no hacen inferencia tipo. Francamente, sin embargo, me convence de todo lo contrario.Usar tipos explícitos - 'auto f = [] (const char * a, float b) {cout << a << '' << b; }; '- molesto como es, es mucho mejor que la solución de enlace presentada en esa respuesta. ¿Con qué frecuencia cree que bind ofrece una solución superior? –