Используйте Sfinae для проверки существования членов пространства имен

StackOverflow https://stackoverflow.com/questions/3600244

Вопрос

Я пытался выяснить, можно ли использовать 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top