指定 std::to_string() 的补充?

3
在C++11中,由于有一个标准std::to_string(),我对枚举类和其他小型数据类进行了函数重载,其中实现具有意义。
我的问题是,你实现了与std::to_string()相对应的什么?
某种类型的from_string()(不存在于std中),或者你在类中实现了更合适的标准接口?

在C++03中,我们可以重载运算符<<>>,以便使用字符串流(boost::lexical_cast)执行字符串转换。 - UncleBens
4个回答

6
标准使用的是老式C语言中使用的简洁命名方案。这意味着在以下情况下:
std::string to_string( int value );

you have

int std::stoi(std::string);

请点击这里。

http://zh.cppreference.com/w/cpp/string/basic_string/stol

所以,您可能会遇到这种情况。

std::string to_string(my_enum);

你可能有

my_enum stomy_enum(std::string)

尽管我会详细说明,但请允许我这样做。
my_enum string_to_my_enum(std::string)

或者只需使用流。
std::stringstream ss(my_str);
if(ss >> emun_) //conversion worked

定义流操作符还允许使用boost的lexical cast;
enum_ = boost::lexical_cast<my_enum>(my_str);

2
它不仅更冗长(通常难以阅读),而且不具有多态性,因此无法与泛型一起使用。这是一个糟糕的解决方案。更好的解决方案将使用重载,可以通过隐式转换的返回类型技巧进行重载,或者明确指定模板,或者输出参数(但我不喜欢后者)。 - Konrad Rudolph
在定义类型的隐式转换时(特别是枚举类型),您应该小心,因为这可能会使代码变得非常难以阅读。它不是通用的,但stoi()也是如此。流在这里是一个好主意(对于通用代码),因为标准和自定义类型通常都定义了它们。 - 111111
我曾经认为std::stoi和其他函数只是C++对C库atoi函数的包装。我认为他想要的更多是针对他自定义对象的插入和提取运算符。 - AJG85
AJG85:我不知道stoi是只包装了C缓冲区实现还是实现了它们,但它们确实与旧的C风格版本相吻合。流操作符是正确的选择,我认为如果你需要进行大量的类型转换,那么你的设计可能有问题。 - 111111
@111111 在这种特定情况下的隐式转换是无害的,因为它将精确地触发用户想要的内容,而不会有其他任何影响。它本质上只是允许根据返回类型重载方法。这从根本上来说是相同的操作,就像输入流一样。 - Konrad Rudolph
Konrad,虽然每个人都知道流式编程范式,但我不认为人们希望将 PHP 全部兼容的代码移植到 C++ 中。这只是我的直觉感觉。 - 111111

0

C++11为算术类型提供了stoistolstod等函数。


如果只是针对算术类型,当然也可以使用 std::atoi(s.c_str())(或 std::atolstd::atof),这些函数在 C++03 中就已经存在了,以达到相同的效果。 - Frerich Raabe

0
如果您的类型是一个类,那么一个以字符串为参数的构造函数对我来说比一个自由函数更有意义。

这取决于您的类型是否需要具有字符串的概念。例如,即使这是一个有用的函数,您也希望将向量初始化为字符串中的CSV。 - 111111
@111111 我认为你的例子中缺少否定。当然,如果类型在某种“自然”的方式下可表示为字符串,则从字符串构造函数才有意义。这是不言而喻的。 - pmr

0

据我所知,C++11标准库只有stoi等函数可以实现这个功能。但是如果您愿意使用boost(我认为它是C++的准标准库),则可以使用boost::lexical_cast。为了让它工作,您只需要为您自己的类定义流运算符operator>>operator<<(用于转换为字符串)的std::istreamstd::ostream)。

即使不使用boost,我仍然会使用流运算符来实现此功能,因此要从字符串中获取整数,我会执行以下操作:

std::string s = ...;
int i;
std::stringstream stream(s);
stream>>i;

当然,你可以将它放入更通用的函数中,这将为你提供类似于boost::lexical_cast的功能。


我认为类型转换应该适度使用,以确保性能不会影响代码的可读性。下一个标准应该是全面考虑。 - 111111

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接