Как вывести кандидатов в функции разрешения перегрузки?
Как я могу сбросить функции-кандидаты (или жизнеспособные функции или лучшие жизнеспособные функции) для вызова функции?
Я знаю, что g++ предоставляет возможность сбросить иерархию классов. (На самом деле, Visual Studio 2010 предоставляет аналогичную опцию, но она недокументирована. Я помню, что читал кое-что об этом - возможно, в блоге команды VC++ - но я не могу вспомнить это ясно.)
Недавно я читал о разрешении перегрузки в черновике C++0x, и это меня очень смутило.
Предоставляет ли какой-либо компилятор возможность сбрасывать функции-кандидаты, жизнеспособные функции или лучшие жизнеспособные функции?
Примечание. Функции-кандидаты в сценарии разрешения перегрузки отличаются от функций-кандидатов в ошибке компилятора. Функция "кандидат / жизнеспособная / лучшая жизнеспособная" в сценарии разрешения перегрузки имеет свое собственное значение. Я знаю, что есть три стадии в разрешении перегрузки: найти подходящие функции; найти жизнеспособные функции; найти лучшие жизнеспособные функции. Обычно, лучшая жизнеспособная функция - только один кандидат; в противном случае вызов неоднозначен. Каждый этап имеет свои правила.
3 ответа
Я не думаю, что есть прямой путь.
Одним из способов является искусственное создание конфликта / двусмысленности. Большинство компиляторов выдают ошибку в форме ниже, выпуская список рассматриваемых кандидатов.
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: в функции 'int main ()': prog.cpp:10: ошибка: вызов перегруженного 'f (double)' неоднозначен prog.cpp:4: примечание: кандидаты: void f(int) prog.cpp:5: note: void f(char) prog.cpp:2: note: void A::f(int)
Один из способов вывести все функции, которые были рассмотрены, - это использовать определенное имя функции с набором параметров, которые не будут ничего соответствовать:
struct DumpThemAll {};
int main(int argc, char* argv[])
{
std::cout << DumpThemAll() << std::endl;
}
Это будет (обычно) сбрасывать все operator<<
которые были рассмотрены для разрешения перегрузки. Для этого конкретного примера это может стать волосатым.
Если вы хотите сбросить только некоторые специфические функции, это намного сложнее. Единственный способ сделать это - искусственно создать неоднозначный вызов, однако вызов будет неоднозначным только в том случае, если предоставляемая вами ложная функция имеет точно такую же "оценку", что и наилучшее совпадение... поэтому трудно придумать одну такую функцию, когда ты не понимаешь, как работает эта оценка (и лично я не все понимаю... слишком много правил...)
Однако я хотел бы добавить, что, хотя, вероятно, есть только несколько человек, которые могут процитировать правила перегрузки на макушке, или, возможно, даже понять это, в общем, это не мешает вам работать, для стандарта пытается рассмотреть все возможные случаи, пока вы работаете только с несколькими из них.
Кроме того, злоупотребление перегрузкой функций / операторов делает вашу программу нечитаемой, потому что она загадочна для людей (особенно с учетом особенностей файлов, включенных в текущий модуль перевода).
Самый простой способ сделать это в Visual Studio - это скомпилировать неоднозначный вызов. Компилятор выдаст ошибку со списком доступных кандидатов. Вероятно, g++ сделает то же самое.