__Traits (hasMember) работает с классами? - PullRequest
3 голосов
/ 04 февраля 2011

Согласно документации , __traits (hasMember, ...) должен работать с любым типом, имеющим члены, но я не могу получить код, который использует его с классами для компиляции. Обратите внимание на следующий фрагмент:

struct A {
    int foo;
}

static assert(__traits(hasMember, A, "foo"));

Это компилируется (хотя это не будет ссылаться, потому что нет главного). Но если я изменю "struct A" на "class A", статическое утверждение срабатывает, и код не будет компилироваться. Я ничего не могу найти в баг-трекере, и кажется, что это большая буква E на глазке. Я что-то не так делаю?

- Изменить: По примеру getMember, похоже, что hasMember работает с классом, только если foo статический. Кроме того, я могу создать экземпляр A и проверить экземпляр на наличие нестатического foo. Проблема в том, что мне нужно проверить наличие нестатического члена класса во время компиляции.

1 Ответ

1 голос
/ 05 февраля 2011

После некоторого размышления я думаю, что это предполагаемое поведение.Представляется разумным, что hasMember должен использоваться вместе с getMember или что, если hasMember имеет значение true, он должен быть законным для установки или вызова этого члена.Очевидно, это не имеет смысла для класса - если поле или метод не являются статическими, его нельзя установить или вызвать без экземпляра.Возможно, свойство instanceHasMember в порядке или хотя бы примечание в документации.

На данный момент я использую проверенный временем

  is(typeof(mixin(`thing.`~member)))

, чтобы проверить это во время компиляции.

...