Я пытаюсь немного узнать о шаблонах и метафункциях, а именно 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<>
для случаев, когда преобразование невозможно, скажем:
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 >>
.