Как вывести кандидатов в функции разрешения перегрузки? - PullRequest
5 голосов
/ 20 сентября 2010

Как я могу сбросить функции-кандидаты (или жизнеспособные функции или лучшие жизнеспособные функции) для вызова функции?

Я знаю, что g ++ предоставляет опцию для вывода иерархии классов . (На самом деле Visual Studio 2010 предоставляет аналогичную опцию, но она недокументирована. Я помню, что читал кое-что об этом - возможно, в блоге команды VC ++ - но не могу вспомнить это ясно.)

Недавно я читал о разрешении перегрузки в черновике C ++ 0x, и это меня очень смутило.

Предоставляет ли какой-либо компилятор возможность сбрасывать функции-кандидаты, жизнеспособные функции или лучшие жизнеспособные функции?

Примечание: Функции-кандидаты в сценарии разрешения перегрузки отличаются от функций-кандидатов в ошибке компилятора. Функция «кандидат / жизнеспособная / лучшая жизнеспособная» в сценарии разрешения перегрузки имеет свое собственное значение. Я знаю, что есть три этапа в разрешении перегрузки: найти подходящие функции; найти жизнеспособные функции; найти лучшие жизнеспособные функции. Обычно, лучшая жизнеспособная функция - только один кандидат; в противном случае вызов неоднозначен. Каждый этап имеет свои правила.

Ответы [ 3 ]

2 голосов
/ 20 сентября 2010

Я не думаю, что есть прямой путь.

Одним из способов является искусственное создание конфликта / двусмысленности. Большинство компиляторов выдают ошибку в форме ниже, извергая список рассматриваемых кандидатов.

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)
2 голосов
/ 20 сентября 2010

Один из способов вывести все функции, которые были рассмотрены, - это использовать определенное имя функции с набором параметров, которые не будут ничего совпадать:

struct DumpThemAll {};

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

Это (обычно) выгрузит всеoperator<<, которые были рассмотрены для разрешения перегрузки.В этом конкретном примере он может стать волосатым.

Если вы хотите сбросить только некоторые специфические функции, это намного сложнее.Единственный способ сделать это - искусственно создать неоднозначный вызов, однако вызов будет неоднозначным, только если предоставляемая вами ложная функция имеет точно такой же «счет», что и наилучшее совпадение ... поэтому трудно придумать одну такую ​​функцию, когдаВы не понимаете, как работает эта оценка (и лично я не понимаю всего этого ... слишком много правил ...)

Однако я бы добавил, что, хотя есть толькоГорстка людей, которые могут процитировать правила перегрузки с ног на голову или, возможно, даже понять их, в общем, это не мешает вам работать, поскольку стандарт пытается рассмотреть все возможные случаи, пока вы работаете только спара из них.

Кроме того, злоупотребление перегрузкой функций / операторов делает вашу программу нечитаемой, потому что она загадочна для человека (особенно если учитывать особенности файлов, включенных в текущий модуль перевода).

1 голос
/ 20 сентября 2010

Самый простой способ сделать это в Visual Studio - это скомпилировать неоднозначный вызов.Компилятор выдаст ошибку со списком доступных кандидатов.Вероятно, g ++ сделает то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...