2010-09-20 15 views
5

¿Cómo puedo volcar las funciones candidatas (o las funciones viables o las mejores funciones viables) para una invocación de función?¿Cómo volcar candidatos en resolución de sobrecarga de función?

Sé g ++ proporciona un option to dump class hierarchy. (De hecho, Visual Studio 2010 ofrece una opción similar, pero no está documentado. Recuerdo haber leído algo al respecto, tal vez en el blog del equipo de VC++, pero no puedo recordarlo claramente)

Recientemente, he estado leyendo sobre la resolución de sobrecarga en el borrador de C++ 0x, y realmente me avergonzó.

¿Algún compilador proporciona una opción para volcar funciones candidatas, funciones viables o las mejores funciones viables?

Nota: Las funciones candidatas en el escenario de resolución de sobrecarga son diferentes de las funciones candidatas en el error del compilador. La función candidata/viable/mejor viable en el escenario de resolución de sobrecarga tiene su propio significado. Sé que son tres etapas en la resolución de sobrecarga: encuentre las funciones candidatas; encuentra las funciones viables; encuentra las mejores funciones viables. Normalmente, la mejor función viable es solo un candidato; de lo contrario, la llamada es ambigua. Cada etapa tiene sus propias reglas.

+2

¿Por qué quiere saber cuáles son las funciones candidatas que no son viables? "¿Que problema estas tratando de resolver?" –

+0

Solo tengo curiosidad y quiero saber cómo funciona exactamente la resolución de sobrecarga. – Yuncy

Respuesta

1

La manera más fácil de hacer esto en Visual Studio es compilar una llamada ambigua. El compilador escupirá un error con una lista de candidatos disponibles. Probablemente, g ++ hará lo mismo.

+0

En este caso, los candidatos disponibles objeto del error del compilador son las mejores funciones viables. No son las funciones candidatas o las funciones viables en la resolución de sobrecarga. – Yuncy

2

No creo que haya ninguna manera directa.

Una forma es crear deliberadamente un conflicto/ambigüedad artificialmente. La mayoría de los compiladores emiten un error del siguiente formulario, escupiendo la lista de candidatos considerados. mensaje de error

namespace A { 
    void f(int x) {} 
} 
void f(int x) {} 
void f(char x) {} 

using namespace A; 

int main(){ 
    f(2.2); 
} 

G ++:

 
prog.cpp: In function ‘int main()’: 
prog.cpp:10: error: call of overloaded ‘f(double)’ is ambiguous 
prog.cpp:4: note: candidates are: void f(int) 
prog.cpp:5: note:     void f(char) 
prog.cpp:2: note:     void A::f(int) 
+0

Las funciones de salida de candidato aquí son diferentes del término de funciones candidatas en el escenario de resolución de sobrecarga. – Yuncy

+2

¿Por qué dice eso? Un candidato es uno que tiene el mismo nombre que el nombre de la función. Agregue otra función 'int f (int x, char x) {} 'en el código que he mostrado arriba y observe cómo gcc informa eso también como un candidato (aunque no es viable lo cual se determina más adelante) – Chubsdad

2

Una forma de deshacerse de todas las funciones que se han considerado, es el uso de un nombre de función en particular con un conjunto de parámetros que no coincidan con cualquier cosa:

struct DumpThemAll {}; 

int main(int argc, char* argv[]) 
{ 
    std::cout << DumpThemAll() << std::endl; 
} 

Esto vaciará (normalmente) todos los operator<< que se consideraron para la resolución de sobrecarga. Para este ejemplo en particular, puede ponerse peludo.

Si desea descargar solo algunas funciones específicas, es mucho más difícil. La única forma de hacerlo sería crear artificialmente una llamada ambigua, sin embargo, una llamada es ambigua solo si la función espuria que usted proporciona tiene exactamente el mismo "puntaje" que la mejor coincidencia ... por lo que es difícil idear una de esas funciones cuando no entiendes cómo funciona esta puntuación (y personalmente, no lo entiendo todo ... hay demasiadas reglas ...)

Sin embargo, agregaría que, aunque probablemente solo haya un puñado de personas que pueden citar las reglas de sobrecarga de la parte superior de su cabeza, o tal vez incluso darle sentido, en general no le impide trabajar, ya que la norma trata de abordar todos los casos posibles mientras usted solo trabaja con un par de ellos.

Además, abusar de la función/sobrecarga del operador hace que su programa sea ilegible porque es arcano para los humanos (especialmente porque está sujeto al particular de los archivos incluidos en la unidad de traducción actual).

Cuestiones relacionadas