используйте sfinae для проверки существования членов пространства имен - PullRequest
5 голосов
/ 30 августа 2010

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

Есть идеи почему?

С уважением,

1 Ответ

10 голосов
/ 30 августа 2010

Нет, это не сработает.Также нет способа использовать 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.

...