2011-04-06 29 views
7

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?

+0

¿Es '' incluso útil, ahora que tenemos lambdas? –

+0

@Marcelo, seguro que sí. 'std :: bind' es muy útil. – Channel72

+1

¿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? –

Respuesta

6
  1. No te lo perdiste.

  2. Motivo convincente? Depende de a quien le preguntes. La falta de esta funcionalidad se discutió, pero no hasta muy tarde en el proceso. Hmm ... No puedo encontrar el papeleo sobre eso en este momento, puede que no haya ninguno.

La mejor solución para esto (imho) es agregar operador!() Para enlazar. Pero para cuando esto sucedió, el comité no estaba de humor para agregar nuevas características a C++ 11. Tal vez vendrá en un informe técnico.

Oh, aquí está el papeleo:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3224.html#gb97

+0

Interesante. No puedo creer que la proposición de sobrecargar '!' For 'bind' haya sido rechazada. – Channel72

+0

El "en este momento" en la respuesta es un discurso de comité para "nos gustaría considerar esto nuevamente después de C++ 0x". Crear un buen estándar consume mucho tiempo. Crear uno perfecto toma literalmente para siempre.

+0

¡Aún más rápido que reparar uno roto! – Potatoswatter

1

efecto, si no de manera oficial, todo del viejo sistema de unión objeto función es obsoleta, ya que lambdas son una solución muy superior. Me resulta más curioso que se molestaron en actualizar el bind y cualquiera de los demás.

Lo más probable es que usted encontrará que esto se debe a que el original boost::bind no proporcionaron una función tal negate, y todo el nuevo mecanismo vinculante TR1/C++ 0x se basa en eso, y nadie se dio cuenta de que faltaba not .

+1

El comité no considera que el enlace sea obsoleto. Aquí hay una buena respuesta SO sobre por qué: http://stackoverflow.com/questions/1930903/bind-vs-lambda/4581747#4581747 –

+0

@Howard: dije "no oficialmente", como en, reconozco que no son desaprobado por el comité. – Puppy

+0

@Dead: Lee esa respuesta ... – Potatoswatter