Каковы хорошие случаи для использования __if_exists? - PullRequest
7 голосов
/ 21 февраля 2011

Когда я использую __if_exists без написания тонны дрянного кода?

Похоже, это ключевое слово похоже на директиву препроцессора C, но обрабатывается после препроцессора. И IntelliSense не анализирует его и не выделяет код как мертвый или живой. Все это делает анализ кода, написанного с помощью __if_exists, действительно нетривиальным.

Пока что я нашел только один относительно безопасный случай. У нас есть контейнерный класс, который принимает адрес хранимого объекта. Когда хранимый класс имеет перегруженный operator&, вызывается перегруженный оператор, и это вызывает проблемы.

Поэтому я добавил следующую проверку:

__if_exists( T::operator& ) {
   static_assert( false );
}

и теперь, по крайней мере, код не будет компилироваться, если есть operator& функция-член сохраненного типа.

ИМО, этот вариант использования довольно понятен и легко читается.

Какие еще случаи использования __if_exists без получения тонны нечитаемого кода?

Ответы [ 2 ]

3 голосов
/ 21 февраля 2011

Хотя я не уверен, что это всегда возможно или полезно, __if_exists может использоваться в некотором смысле как static if на языке D.
Например, следующий код печатает b.

template< bool > struct static_if_t;
template<> struct static_if_t< true > {};
#define STATIC_IF( c )     __if_exists    ( static_if_t< (c) > )
#define STATIC_UNLESS( c ) __if_not_exists( static_if_t< (c) > )

struct X {
  static bool const v = false;
};

STATIC_IF( X::v ) {
  void f() { puts("a"); }
}
STATIC_UNLESS( X::v ) {
  void f() { puts("b"); }
}

int main() {
  f(); // prints "b"
}
2 голосов
/ 21 февраля 2011

Я думаю, что вы можете использовать его для различения объединений и классов, поскольку классы имеют конструкторы, а объединения не имеют.

Вы хотели бы это, например, в boost::type_traits::is_class<T> и boost::type_traits::is_union<T>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...