Используйте Sfinae для проверки существования членов пространства имен
-
25-09-2019 - |
Вопрос
Я пытался выяснить, можно ли использовать Sfinae для тестирования пространство имен Наличие члена. Google довольно молчил об этом. Я попробовал следующий код, но не удается.
namespace xyz{
struct abc{};
}
struct abc{};
struct test_xyz{
typedef char yes;
typedef struct{ char a[2]; } no;
template <class C> static yes test(xyz::C = xyz::C()); //lets assume it has default constructor
template <class C> static no test(...);
const bool has_abc = sizeof(test_xyz::test<abc>()) == sizeof(yes);
};
Любая идея почему?
С уважением,
Решение
Нет, это не будет работать. Также нет способа использовать 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
. Отказ Однако, если он не содержит этого участника, то имя используемого Директива будет найдено и ссылаться на fallbacks::abc
.