Кроме T это пространство имен, а не структура или класс. Каков наилучший способ достижения результата, наиболее похожего на то, что я ожидаю?
Не упоминайте T
.
template <typename X>
void foo(X* x)
{
bar(x);
}
ADL всегда будет обрабатывать перегрузки из пространства имен, в котором определен X
. Пусть механизм сделает свою работу.
Теперь, если вы спрашиваете, как заставить компилятор отдавать предпочтение функциям, найденным ADL, все дело в манипулировании разрешением перегрузки. Мы можем сделать это, ограничивая то, что выбирается обычным поиском неквалифицированных имен:
namespace foo_detail {
void bar(...);
template<typename X>
void foo_impl(X* x) {
bar(x);
}
}
template <typename X>
void foo(X* x)
{
foo_detail::foo_impl(x);
}
Когда вызов в foo_detail::foo_impl
пытается разрешить bar
, первая фаза двухфазного поиска вызовет функцию аргумента переменной C. Теперь поиск прекращается, больше не будет просматриваться никаких дополнительных пространств имен. Это означает, что только ADL может предложить больше кандидатов. И из-за того, как работает разрешение перегрузки, функция аргумента переменной в стиле C, как мы добавили, будет хуже, чем все, что найдет ADL.
Вот живой пример для всего этого на работе.