У меня есть следующая шаблонная функция
template <typename As, typename std::enable_if<
std::is_arithmetic<As>::value, As>::type* = nullptr >
As getStringAs(const std::string& arg_name)
{
std::istringstream istr(arg_name);
As val;
istr >> val;
if (istr.fail())
throw std::invalid_argument(arg_name);
return val;
}
И я хотел бы использовать ее так:
getStringAs<float>("2.f");
Что было бы хорошим способом специализировать функцию для std::string
чтобы я мог написать
getStringAs<std::string>("2.f");
Я перепробовал все свои известные способы, но все они, похоже, потерпели неудачу из-за неоднозначности, генерируемой типом std::enable_if
по умолчанию.Например: если я напишу:
template<>
std::string getStringAs<std::string>(const std::string& arg_name)
{
}
Это не будет соответствовать какой-либо перегрузке шаблона.Если я добавлю второй тип, это сгенерирует ошибку неоднозначности.Я попробовал Google-In, но единственное, что я мог найти, было об отправке тегов, но это сделало бы вызов уродливым на стороне пользователя.Я думал об очень уродливом решении использовать макроопределение для замены getStringAs<std::string>
тегом отправки.
Спасибо!