You may `Condition` the function pattern such that it matches for a parameter of `Head` `Function` or on the `DownValues` of the symbol when they have the pattern of that matches a *basic* function define by `SetDelayed`. 

As pointed out in the OP comments there are many forms that a *function* can take and the solution below will not cover them all.  However, it may be enough to cover the cases within your particular project.

With

    ClearAll[g]
    g[func_, a_, b_] /; 
      MatchQ[func, _Function] \[Or] 
       Length@Cases[DownValues[func][[All, 1]], \[FormalP] : HoldPattern[_[_Pattern .., ___]] :> 
           Hold@\[FormalP], 2] > 0 :=
     func[a + b]

and

    f[x_] := x^2 - 1

Then

    g[f, 1, 2]
>     8

    g[# + 1 &, 1, 2]
>     4

    g[y, 1, 2]
>     g[y, 1, 2]

Hope this helps.