Такое поведение можно получить, сделав функцию-член шаблоном функции-члена и используя SFINAE (ошибка замещения не является ошибкой).Например:
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)
{
}
Проверка черты типа is_integral
, является ли U
целочисленным типом.Если это не так, первый экземпляр создается;если это так, то создается второй экземпляр.
Типовые тесты is_same
для проверки того, что T
и U
относятся к одному типу.Это используется для гарантии того, что шаблон функции-члена не создается ни для какого типа, кроме Foo<T>
.
В этом примере используется библиотека C ++ 0x <type_traits>
;Boost также имеет библиотеку признаков типа , которую вы можете использовать, которая работает в основном так же.