В этот ответ Я определяю шаблон, основанный на свойстве типа is_arithmetic
:
template<typename T> enable_if_t<is_arithmetic<T>::value, string> stringify(T t){
return to_string(t);
}
template<typename T> enable_if_t<!is_arithmetic<T>::value, string> stringify(T t){
return static_cast<ostringstream&>(ostringstream() << t).str();
}
dyp предлагает, что вместо свойства is_arithmetic
этого типа определяется, является ли to_string
для типа критерием выбора шаблона. Это явно желательно, но я не знаю, как сказать:
Если
std::to_string
не определено, используйте перегрузкуostringstream
.
Объявление критериев to_string
прост:
template<typename T> decltype(to_string(T{})) stringify(T t){
return to_string(t);
}
Это противоположность этим критериям, что я не могу понять, как построить. Это явно не работает, но, надеюсь, он передает то, что я пытаюсь построить:
template<typename T> enable_if_t<!decltype(to_string(T{})::value, string> (T t){
return static_cast<ostringstream&>(ostringstream() << t).str();
}