Boost.MPL не справляется с этим, так как это строго для TMP, и вы не можете вызывать участников в TMP.Boost.Fusion и Boost.TypeTraits тоже ничего не имеют;Я думал, что один из них будет, но, по-видимому, я запоминаю.
Здесь и здесь - некоторые решения о том, как написать признак для обнаружения члена в C ++03.Если у вас есть такая черта (я назову ее has_func1_member
), вы можете использовать ее для SFINAE:
template<typename T>
typename boost::enable_if<has_func1_member<T> >::type
maybe_call(T& t)
{ t.func1(); }
template<typename T>
typename boost::disable_if<has_func1_member<T> >::type
maybe_call(T&)
{
// handle missing member case
}
// your example code would then do:
maybe_call(param);
Обратите внимание, что с C ++ 11 проще написать эту черту в первую очередь, хотя это все еще несколько загадочно.