Functions, function pointers, delegates, lambdas.
void f() { } int g(int x) { return x; } static assert( isCallable!f); static assert( isCallable!g); auto fp = &f; static assert( isCallable!fp); static assert( isCallable!((int x) {})); int x; static assert(!isCallable!x);
Aggregate types with (static) opCall.
class C { int opCall(int) { return 0; } } auto c = new C; struct S { static int opCall(int) { return 0; } } interface I { real value() @property; } static assert( isCallable!c); static assert( isCallable!(c.opCall)); static assert( isCallable!S); static assert( isCallable!(I.value)); static assert( isCallable!((int a) { return a; })); static assert(!isCallable!I);
Template functions are only detected if they are instantiable with !().
void f()() { } T g(T = int)(T x) { return x; } struct S1 { static void opCall()() { } } struct S2 { static T opCall(T = int)(T x) {return x; } } static assert( isCallable!f); static assert( isCallable!g); static assert( isCallable!S1); static assert( isCallable!S2); static assert(!isCallable!((x) {}));
Overloaded functions and function templates instantiable with !().
static struct Wrapper { void f() { } int f(int x) { return x; } void g()() { } T g(T = int)(T x) { return x; } } static assert(isCallable!(Wrapper.f)); static assert(isCallable!(Wrapper.g));
Detect whether T is a callable object, which can be called with the function call operator $(LPAREN)...$(RPAREN).