Я попытался реализовать функцию, которая преобразует общий тип в строку. Интегральные типы должны быть преобразованы с использованием std::to_string()
, строк и символов с использованием std::string()
и векторов по элементам в строку с использованием одного из других методов (в зависимости от их содержимого).Проблема с enable_if и несколько условий
Это то, что у меня есть:
//Arithmetic types
template<class T>
typename std::enable_if<std::is_arithmetic<T>::value, std::string>::type convertToString(const T& t){
return std::to_string(t);
}
//Other types using string ctor
template<class T>
typename std::enable_if<std::__and_<std::__not_<std::is_arithmetic<T>>::type,
std::__not_<std::is_same<T, <T,
std::vector<typename T::value_type, typename T::allocator_type>>::value
>>>::value, std::string>::type convertToString(const T& t){
return std::string(t);
}
//Vectors
template<class T>
typename std::enable_if<std::is_same<T, std::vector<typename T::value_type,
typename T::allocator_type>>::value, std::string>::type convertToString(const T& t){
std::string str;
for(std::size_t i = 0; i < t.size(); i++){
str += convertToString(t[i]);
}
return str;
}
Проблема заключается в том, что вторая функция не компилируется. Как я могу создать вторую функцию, чтобы она компилировала (и работала) и не создавала проблемы неоднозначности?
Это очень элегантное решение :) Я не как и синтаксис enable_if, очень сильно усложняет чтение кода. – Overblade
Это действительно хорошее решение; потребовалось некоторое время, чтобы выяснить, как это работает, пока я не понял, что он просто нарежет «выбор <0>', пока не достигнет подходящей функции.Я считаю, это один вопрос, хотя: По вопросу, он хочет 'char's быть обработано' 'выбора <1> версии, а не' 'выбора <0> версии ([который в настоящее время вызовы] (HTTP://ideone.com/O3N4xB)). –
@JustinTime 'char' является арифметическим, поэтому это соответствует порядку OP. Легко перевернуть. – Barry