Это хорошая практика или есть более элегантное решение?
ИМХО, вы можете использовать его со сторонней библиотекой. Это понятно и достаточно выразительно. Было бы лучше, если бы вы могли написать:
void World() {
::f(100); // f from global namespace
::f(100, 200); // f from global namespace
f(100, 200, 300); // f NOT from global namespace
}
, потому что тогда ясно видно, какая функция равна , а какая не является из глобального пространства имен, но это решение у вас не работает, так как вы не можете изменить реализацию функции World
.
Могу ли я импортировать только f(int)
, а не f(int, int)
?
Да. Чтобы импортировать только f(int)
функцию, вы можете сделать следующее:
void f(int) {}
namespace Hello {
using ::f; // only void f(int) is defined before this line
// therefore, it is the only overload being imported to the Hello namespace
}
void f(int,int) {}
Демо
ОБНОВЛЕНИЕ
Если вы хотите импортировать только одну перегрузку operator<<
, а не обычной функции, тогда вы можете заключить каждую перегрузку в отдельное пространство имен, например:
namespace XX {
struct X {
int x;
};
std::ostream& operator<<(std::ostream& os, X const& x) {
return os;
}
}
namespace YY {
std::ostream& operator<<(std::ostream& os, Y const& y) {
return os;
}
struct Y {
double y;
};
}
namespace Hello {
using ::XX::X;
using ::XX::operator<<;
using ::YY::Y;
}
Проверьте это live .