The best way I know of is checking if you can actually call the function and if it returns the type you expect. Here's an example of how to detect if a class C
has a receive
method which takes const Event&
as a parameter and "returns" void
. The detection does not care whether the method is implemented in the class C
directly or in some base class that C
derives from, neither does it care whether there are further defaulted parameters. Adapt as needed.
template< typename C, typename Event, typename = void >
struct has_receive
: std::false_type
{};
template< typename C, typename Event >
struct has_receive< C, Event, typename std::enable_if<
std::is_same<
decltype( std::declval<C>().receive( std::declval<const Event&>() ) ),
void
>::value
>::type >
: std::true_type
{};
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…