, , , TBody. -, , . .
, , TBody v = parameter.member , , parameter.member .
, . , , g(x) . , template <typename T> void g( T ) , T . , , .
, T , p . , , . p.member, p T, , , ( , , typename). h(p.member); T , , , , , .
. T , sample. , . p.member, member , int, h( p.member ); . T , g(x): , , h, int&, , h ...
For metaprogramming, it is very important to understand that type inference is performed only by the actual signature of the function, and not by the body, and this is what makes it non-trivial for beginners. Using enable_if(from boost or elsewhere) in the function signature as an argument or return type is not a coincidence, but the only way that the compiler cannot replace the type before the template is selected as the best candidate and the replacement failure turns into an actual error (not SFINAE)