Может быть, вы могли бы использовать следующий хак. Учитывая эти простые черты типа:
template<bool b, typename T, typename U>
struct conditional { typedef T type; };
template<typename T, typename U>
struct conditional<false, T, U> { typedef U type; };
template<typename T, typename U>
struct is_same { static const bool value = false; };
template<typename T>
struct is_same<T, T> { static const bool value = true; };
Вы можете написать свой класс и специальную функцию-член следующим образом:
class ReturnTypeSpecialization
{
public:
template<typename T>
typename conditional<is_same<T, float>::value, int, T>::type
Item();
};
// Normally just return the template type
template<typename T>
typename conditional<is_same<T, float>::value, int, T>::type
ReturnTypeSpecialization::Item() { return T(); }
// When a float is specified, return an int
template<>
int ReturnTypeSpecialization::Item<float>() { return 1.0f; }
Простая тестовая программа (использует C++ 11 только для проверки):
int main()
{
ReturnTypeSpecialization obj;
static_assert(std::is_same<decltype(obj.Item<bool>()), bool>::value, "!");
static_assert(std::is_same<decltype(obj.Item<float>()), int>::value, "!");
}
Адрес live example.
что вы пытаетесь достичь? – didierc
Я хочу, чтобы функция возвращала тип, предоставленный в качестве аргумента шаблона, за исключением одного специального случая, я хочу, чтобы функция возвращала другой тип. –
Только для записи. Если аргумент шаблона выводится из типа аргумента, а не явно указан, более простой способ выполнить возврат другого типа - это использовать функцию перегрузки. (Конечно, это не будет работать в этом примере, потому что аргументов нет) – jorgbrown