gpt4 book ai didi

c++ - 防止为字符串流提取运算符 (>>) 不支持的类型实例化模板类

转载 作者:太空宇宙 更新时间:2023-11-04 15:30:33 24 4
gpt4 key购买 nike

我正在尝试学习一些关于模板和元函数的知识,即 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无法将字符串转换为 vector ,因此它总是会失败。

我的问题是:

我可以格式化 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 >> 支持的所有值。运营商。

最佳答案

如果您更喜欢使用带有类模板参数的 SFINAE,那么您需要

template <
typename T,
typename = decltype(std::declval<std::istringstream &>() >> std::declval<T &>(), void())
>
class Input /*...*/

关于c++ - 防止为字符串流提取运算符 (>>) 不支持的类型实例化模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54465333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com