Знание, принимает ли функция ссылку или значение во время выполнения - PullRequest
1 голос
/ 22 августа 2010

Так что это чисто академический вопрос, по большей части давным-давно, с тех пор, как я сделал что-то слишком сложное в C ++. Но есть ли способ узнать, принимает ли метод параметр в качестве ссылки или значение? Это не важно для указателей, так как если вы попытаетесь передать не указатель на метод, который получает указатель, вы получите ошибку компиляции. Но что-то вроде

<code>
int someFunction(int &x){

x = 0

return x;

}

int main(){

int v = 4;

int l = someFunction(v);

Я понимаю, что этого можно избежать, объявив v как const. Но мне просто интересно, есть ли способ узнать во время выполнения, какая-нибудь функция принимает ссылку или значение?

Помечены как C и C ++, есть ли разница в том, как кто-либо обрабатывает это?

Моя ошибка в отношении C. Прошло много времени с тех пор, как я работал только в C и точно забыл, где находится граница, lol

Ответы [ 4 ]

2 голосов
/ 22 августа 2010

Да.На любом языке можно создать функцию, которая возвращает разные результаты в зависимости от того, использует ли функция передачу по значению или передачу по ссылке.Это не должно использоваться в повседневном программировании, но это полезно для тестирования компилятора, тестирования API и т. Д. По сути, вызывайте вашу функцию с переменной, которая инициализируется некоторым значением, а в функции назначьтедругое значение параметра.В вызывающей программе проверьте значение параметра после вызова функции, чтобы увидеть, оказала ли мутация видимый эффект.Обратите внимание, что я предполагаю, что вы написали как вызывающего, так и вызываемого.

Если вы хотите проверить произвольную функцию, которую вы не можете контролировать, вы можете использовать перегрузку функции, чтобы сказать вам, какой типиспользуется схема передачи параметров:

bool IsPassingByReference(int (*func)(int)) { return false; }
bool IsPassingByReference(int (*func)(int&)) { return true; }

Как уже было отмечено, это применимо только к C ++.(У C есть указатели, но нет ссылок).

1 голос
/ 22 августа 2010

Если вы передаете некоторый неосновной тип (например, int, char и т. Д.), А скорее экземпляр некоторого класса, вы можете изменить конструктор копирования этого класса для печати чего-либо, когда он копируется.

Теперь, если функция использует значение, конструктор копирования будет вызываться при вызове этой функции, а если она использует ссылку, копия не будет, и конструктор копирования не будет вызываться.

Вы можете проверить наличие этой распечатки, чтобы определить, использовала ли функция значение или ссылку.

0 голосов
/ 22 августа 2010

Этот вопрос выглядит немного странно.Вы хотите знать во время выполнения то, что уже известно во время компиляции.Итак, прямой ответ для someFunction: да, его параметр является ссылкой, потому что это ссылка.И это известно как во время компиляции, так и во время выполнения.Такого рода вопросы обычно задаются авторами шаблонов, которым необходимо определять тип параметра во время компиляции.

Обычно программисты на C ++ стараются сделать как можно больше во время компиляции, и вы хотите сделать во время выполнения то,может быть сделано во время компиляции.

0 голосов
/ 22 августа 2010

AFAIK нет способа узнать это во время выполнения. Или во время компиляции в этом отношении. C ++ просто не построен таким образом. Вам следует поискать «Отражение» - способность программы знать свою структуру У C ++ его нет, например, у Java.

C не имеет ссылок.

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