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.