Доброго времени суток, уважаемое Хабрасообщество.
Сегодня я хочу поделиться одним интересным приемом, который позволяет определять компилируемость любого конкретного выражения.
Пример:
Как Вы уже, наверное, догадались мы будем думать как написать макрос DECLARE_IS_VALID_EXPRESSION.
Сегодня я хочу поделиться одним интересным приемом, который позволяет определять компилируемость любого конкретного выражения.
Пример:
/* Определяем метафункцию HasF, которая позволяет определить наличие функции f() у любого класса. */
DECLARE_IS_VALID_EXPRESSION(
HasF,
( ( U * ) NULL )->f() /* Это выражение компилируемо только если присутствует U::f() */ );
struct Foo{ void f(); };
struct Bar{};
BOOST_STATIC_ASSERT( HasF< A >::value ); /* Тут константа HasF< A >::value будет true */
BOOST_STATIC_ASSERT( !HasF< B >::value ); /* Тут константа HasF< A >::value будет false */
Как Вы уже, наверное, догадались мы будем думать как написать макрос DECLARE_IS_VALID_EXPRESSION.