如此处所述,std::string
并不是一个模板函数,而是标准选择使用函数重载来为不同的类型提供该函数。我的问题是,当在这种情况下,使用模板/特化似乎更有意义时,为什么要使用重载?考虑到如果标准定义了像这样的内容:
template <typename T>
std::string std::to_string(const T& v);
我们可以自由地为程序中的任何类型添加特化,以符合此签名,从而使C++具有将类型转换为可读字符串的统一方式。为什么不这样做呢?当前设计背后的思考是什么?
我对当前设计的主要批评是不允许向std添加重载,因此我们不能编写类似于std:to_string(用户定义类型对象)的任何内容,并且必须退回到在它们自己的命名空间中定义一个to_string()并记住在处理不同类型时使用自己的版本或std版本... 对我来说听起来像个头疼问题。
我非常喜欢Python(或其他一些语言)的一点,即您可以通过实现一些魔术方法使自己的类型像本地类型一样工作。我认为这个问题的根本就是为什么C ++决定禁止人们为自己的类型实现std :: to_string() ,从而禁止我们在所有地方符合相同的接口。
对于像哈希或to_string()之类的常见事物,是否最好在语言/stdlib级别上拥有单个接口,然后期望用户遵守该接口,而不是拥有多个接口?
std
命名空间。 - bartopto_string
背后的想法。它也可以类似于begin
和end
一样指定,例如查找to_string
成员函数。毫无疑问,对象可以被转换为字符串的一般方式是有争议的,这可能是这样做的原因。 - t.niesestd
添加重载。它适用于swap
,也适用于其他函数。只要ADL能够找到它,你可以将重载放在任何地方,答案详细解释了这一点。你看到的缺点并不存在。 - 463035818_is_not_a_number