Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
#include <iostream>
typedef char Small;
class Big {char dummy[2]; };
template <size_t> struct ClassSelector {
typedef Big type_;
};
template <> struct ClassSelector< sizeof(1)/sizeof(1) > {
typedef Small type_;
};
#define DECLARE_IS_VALID_EXPRESSION( NAME, U_BASED_RUNTIME_EXPRESSION )\
template< class T > \
struct NAME\
{\
template< typename U > static typename ClassSelector< sizeof( U_BASED_RUNTIME_EXPRESSION, 1 ) / sizeof( U_BASED_RUNTIME_EXPRESSION, 1 )>::type_ F( void * );\
template< typename U > static typename ClassSelector<0>::type_ F( ... );\
enum { is_valid = ( sizeof( F<T>( NULL ) ) != sizeof( ClassSelector<0>::type_ ) ) };\
};
struct Foo{ void f(); };
struct Bar{};
DECLARE_IS_VALID_EXPRESSION(HasF, ( ( U * ) NULL )->f() );
DECLARE_IS_VALID_EXPRESSION(
IsStreamSerializationSupported,
( (std::cout << *(U *)NULL), (std::cin >> *(U *)NULL) ) );
int main(int argc, char *argv[])
{
std::cout << HasF<Foo>::is_valid <<
HasF<Bar>::is_valid <<
IsStreamSerializationSupported<double>::is_valid <<
IsStreamSerializationSupported<Bar>::is_valid ;
return 0;
}
DECLARE_IS_VALID_EXPRESSION(...) определяет шаблон, и к нему применяется только проверка №1.BOOST_STATIC_ASSERT( HasF< A >::value ) инстанцирует шаблон HasF параметром A, применяется проверка №2.
Шаблонная магия, метафункция IsValidExpression