Я пытаюсь немного узнать о шаблонах и метафункциях, а именно о std::enable_if
. Я делаю систему меню для наших школьных заданий (внеклассных, заметьте), и мне нужен способ получения информации от пользователя. Я хотел бы определить класс шаблона для различных типов ввода - что-нибудь, используемое в следующих строках:
std::string userInput = Input<std::string>("What's your name?").Show();
float userHeight = Input<float>("How tall are you?").Show();
Я бы хотел (и я уверен, что есть причины не делать этого, но тем не менее) выполнить этот обобщенный вид преобразования с использованием std::stringstream
: получить ввод от пользователя, подать в SS, извлечь в переменную типа T.
Достаточно легко увидеть, не удалось ли преобразование во время выполнения, но я бы хотел использовать std::enable_if
, чтобы люди не могли использовать мой Input<>
class в случаях, когда преобразование невозможно, например:
std::vector<Boats> = Input<std::vector<>>("Example").Show();
Очевидно, что std::stringstream
не может преобразовать строку в вектор, поэтому всегда будет терпеть неудачу.
У меня такой вопрос:
Могу ли я отформатировать предложение std::enable_if
, чтобы разрешить создание экземпляра моего класса шаблона ТОЛЬКО для перечисленных выше типов? В качестве альтернативы, есть ли лучший способ сделать это? У меня все совсем не так?
Что я сделал до сих пор
Я считаю, что нашел список разрешенных типов, которые std::stringstream
могут преобразовывать строку в:
http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/
Я использовал std::enable_if
вот так до этого момента:
template <typename T, typename = typename
std::enable_if<std::is_arithmetic<T>::value, T>::type>
Однако теперь я хотел бы расширить его, чтобы разрешить не только арифметические значения, но и все значения, поддерживаемые оператором sstream >>
.
static_asset
- это другой сценарий, чем SFINAE. SFINAE по-прежнему может выдавать ужасные сообщения об ошибках. По крайней мере, у вас есть пара ответов, которые позволят вам использоватьstatic_assert
- person NathanOliver   schedule 31.01.2019