Нет, это не сработает.Также нет способа использовать SFINAE таким образом (это в последний раз обсуждалось на usenet для проверки совместимости с некоторым компонентом C ++ 0x).C внутри xyz::C
вообще не связан с параметром шаблона.
Помните, что шаблоны - это не просто макросы.Параметр C
обозначает не просто фрагмент текста, а семантическую сущность.В данном случае это тип.Это уже связано со значением, которое оно имеет в качестве аргумента.То есть, если у вашего класса есть член с именем abc
, значение параметра все равно не изменится.
Если все, что вам нужно, это использовать некоторую структуру xyz::abc
, если она существует, и others::abc
в противном случае, вы можете сделать некоторые трюки, чтобы добраться туда, но я не знаю, как это сделать безприкосновение к xyz
namespace others {
struct abc{};
}
namespace fallbacks {
using others::abc;
}
namespace xyz {
using namespace fallbacks;
}
Теперь, если вы скажете, что xyz::abc
и xyz
содержит член, объявленный так, он будет ссылаться на этого члена (этот член будет скрывать один в fallbacks
.он не содержит этого члена, тогда имя директивы using будет найдено и ссылается на fallbacks::abc
.