为什么to_string没有模板化?

3
我认为to_string只是一个模板,并在内部使用stringstream。这不是这种情况吗?我想要能够做到这一点:
class foo{};

ostream& operator<<(ostream& os, const foo& /*bar*/){
    os << "foo";
    return os;
}

int main() {
    foo bar;
    string tsTest = to_string(bar);

    return 0;
}

显然,这并不起作用,因为to_string没有模板化。

2
std::stringstream 不是最有效的转换方法,可能这就是为令其无法成为模板化的原因,因此每个重载使用了更有效的函数? - Galik
2
文档上可以明显看出, std::to_string是一组标准重载函数,而不是函数模板。 - Lightness Races in Orbit
1
首先,std::to_string 是基于 sprintf 而非 std::ostringstream 定义的。很可能,其意图是可以这样实现。 - James Kanze
总的来说:标准完全可以指定使用std::ostringstream作为模板的std::to_string,并为内置数值类型指定显式重载。在我看来,这可能是更好的解决方案;内置数值类型具有各种格式选项,您可能希望设置或不设置,而用户定义的类型通常没有。 - James Kanze
@JonathanMee - 不幸的是,我认为源代码就是文档。从查看Conv.h来看,似乎使用enable_if来确定正在使用哪些类型,然后每种转换都有自己的处理逻辑。总体上应用的哲学似乎是任何可能失败的转换要么不编译,要么生成运行时异常。Facebook的大多数后端服务实际上都是用C++编写的。 - Mark
显示剩余7条评论
1个回答

3
不,to_string 不适用于任何类型。它只有针对基本标准类型的重载。不幸的是,它无法替代 boost::lexical_cast

在即将到来的 TS 中,boost::lexical_cast 是否会对普通用户开放? - Jonathan Mee
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Lightness Races in Orbit

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