Оболочка C ++ с тем же именем? - PullRequest
3 голосов
/ 19 февраля 2009

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

Например, у меня есть в A.h foo (int bar); и в A.cpp его реализация, и в B.h foo (int bar); и в B.cpp foo (int bar) {foo (bar)}

Я хочу, чтобы fc (bar) в B.cpp вызывал foo (int bar) A.h, а не сам по себе рекурсивно.

Как я могу это сделать? Я не хочу переименовывать foo.

Обновление:

A.h находится в глобальном пространстве имен, и я не могу его изменить, поэтому я полагаю, использование пространств имен не вариант?

Обновление:

Пространства имен решают проблему. Я не знал, что вы можете вызвать глобальную функцию пространства имен с помощью :: foo ()

Ответы [ 5 ]

4 голосов
/ 19 февраля 2009

использовать пространство имен

namespace A
{
int foo(int bar);
};
namespace B
{
int foo(int bar) { A::foo(bar); }
};

вы также можете писать, используя пространство имен A; в вашем коде, но настоятельно рекомендуется никогда не писать с использованием пространства имен в заголовке.

3 голосов
/ 19 февраля 2009

B вообще наследует / реализует A?

Если это так, вы можете использовать

int B::foo(int bar) 
{ 
   ::foo(bar); 
}

для доступа к foo в глобальном пространстве имен

или если он не наследуется .. вы можете использовать пространство имен только на B

namespace B
{
int foo(int bar) { ::foo(bar); }
};
1 голос
/ 19 февраля 2009

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

1 голос
/ 19 февраля 2009

Это проблема, которую пытаются решить пространства имен. Можете ли вы добавить пространства имен к рассматриваемым foo? Тогда у вас есть способ решить это. В любом случае, вы столкнетесь с проблемами компоновщика, если оба они находятся в глобальном пространстве имен.

0 голосов
/ 19 февраля 2009

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

...