You can sort of get this behavior by making the member function a member function template and using SFINAE (substitution failure is not an error).  For example:
template <typename U>
typename std::enable_if<!std::is_integral<U>::value && 
                        std::is_same<T, U>::value, void>::type
f(const Foo<U>& x)
{
}
template <typename U>
typename std::enable_if<std::is_integral<U>::value && 
                        std::is_same<T, U>::value, void>::type
f(const Foo<U>& x)
{
}
The is_integral type trait test whether U is an integer type.  If it is not, the first is instantiated; if it is, the second is instantiated.  
The is_same type trait tests to ensure T and U are the same type.  This is used to ensure that the member function template is not instantiated for any type other than Foo<T>.
This example makes use of the C++0x <type_traits> library; Boost also has a type traits library that you can use, which works mostly the same.