Внешняя часть, конечно, довольно проста.Используйте boost :: mpl :: if_, чтобы решить, какой тип int_ возвращать из вашей мета-функции, а затем получить доступ к значению в нем.Ничего страшного.
Часть, где вы пытаетесь выяснить, есть ли у типа X функция f (), все еще довольно проста, но, к сожалению, вы не найдете общего ответа.Каждый раз, когда вам понадобится такая проверка, вам придется написать собственную метафункцию, чтобы это выяснить.Используйте SFINAE:
template < typename T >
struct has_foo
{
typedef char (&no) [1];
typedef char (&yes) [2];
template < void (T::*)() >
struct dummy {};
template < typename S >
static yes check( dummy<&S::foo> *);
template < typename S >
static no check( ... );
enum { value = sizeof(check<T>(0)) == sizeof(yes) };
};
Редактировать: Да, и создать средство проверки для статического констант L с помощью BOOST_MPL_HAS_XXX ()