2010-11-25 10 views
9

¿Por qué se inventó la búsqueda dependiente de los argumentos (ADL)? ¿Es solo para que podamos escribir cout << stuff en lugar de std::operator<<(cout, stuff)? Si ese es el caso, ¿por qué ADL no estaba limitado a los operadores en lugar de a todas las funciones?¿Por qué se inventó la búsqueda dependiente de argumentos?

¿Se podría haber evitado la introducción de ADL si C++ hubiera tenido alguna otra forma de hacer una salida genérica de ambos tipos incorporados y definidos por el usuario, por ejemplo un tipo seguro printf mediante plantillas variadic?

Respuesta

11

ADL se inventó para permitir que el Principio de interfaz:

La interfaz Principio

Para una clase X, todas las funciones, incluidas las libres, que tanto

  • "mención "X y
  • se entregan con" X

son lógicamente parte de X, debido a que forman parte de la interfaz de X.

Salida excelente Guru of the Week de Herb Sutter sobre el tema.

1

Sí, fue principalmente inventado por los operadores. Pero también le da la posibilidad de incluir funciones que no sean miembros en la interfaz de su clase. Y esto es algo muy poderoso que me gusta mucho. Y esto no se limita a los operadores más. Por ejemplo, podría querer definir una función cross_product para su clase vector; ya sabe a qué me refiero :)

3

Se inventó para permitir el polimorfismo funcional. La idea es que la función sea un verbo (como "imprimir"), tiene solo un significado. Todavía puede haber una implementación diferente dependiendo de a qué se aplica el verbo (como int y float y std :: string).

Por lo tanto, queremos una palabra para el concepto pero varias implementaciones dependiendo de a qué se aplica.

Lo que se aplica es el argumento (s). Así que necesitábamos una forma de usar la misma palabra en varios tipos diferentes de argumentos con - donde sea necesario - implementación relativa al tipo de argumento.

Trate de escribir una concatenación compleja con las funciones printInt(), printString(), printFloat(), verá la obvia verbosidad.

La otra razón es que permite verificar qué implementación está disponible para el tipo de argumento de entrega. Si no hay una implementación disponible (ni siquiera genérica - usando plantillas), entonces el compilador lo parará tan pronto como pueda y le hará saber que no tiene una implementación de su verbo para el argumento dado.

6

Si ese es el caso, ¿por qué ADL no estaba limitado a los operadores en lugar de a todas las funciones?

¿Por qué limitarlo artificialmente? ADL puede ser difícil de implementar (cuando se combina con reglas de sobrecarga de C++) pero es una técnica extremadamente útil. Por un lado, el hecho de que también funcione en funciones hace que sea mucho más fácil usar otros espacios de nombres sin importar todo el espacio de nombres.

El caso en cuestión, el SeqAn library:

using seqan::String; 
String<Char> url = "http://www.seqan.de/"; 
std::cout << "The URL " << url << " has length " << length(url) << std::endl; 

Tenga en cuenta que he utilizado la función seqan::length sin calificar su nombre completo. ADL lo encuentra de todos modos. La biblioteca SeqAn utiliza tales funciones de ámbito de espacio de nombres excesivamente y prefijar cada uso con el nombre del espacio de nombres no sería práctico. Del mismo modo, importar el espacio de nombres a menudo no es aconsejable.

Lo mismo es cierto para muchas otras bibliotecas, como la mayoría de Boost.


y creo que esto no se dio cuenta de inmediato por el comité.

+1

Exactamente. Sin ADL, estarías escribiendo ' :: ...' * mucho *. O mejor dicho, probablemente usarías 'using namespace' mucho, lo que efectivamente sería deshabilitar una característica muy agradable del lenguaje. – DevSolar

4

¿Por qué no limitarlo a los operadores? mirada

Vamos a un simple algoritmo genérico:

template <typename FwdIt, typename T> 
FwdIt remove(FwdIt first, FwdIt last, T const& value) 
{ 
    using std::swap; 

    FwdIt result = first; 
    for (; first != last; ++first) 
    if (!(*first == value)) swap(*result++, *first); 
    return result; 
} 

¿Cómo funciona con tipos personalizados y su propia versión de swap? Gracias a ADL.

Esto es lo que Sutter llama el Principio de interfaz, como mencionó Daniel.

Cuestiones relacionadas