dor*_*mon 3 c++ templates libstdc++
正如这里 所说std::string的不是模板函数,而是标准选择使用函数重载来为不同类型提供此函数。我的问题是,在这种情况下,当模板/专业化似乎对我更有意义时,为什么要使用重载?考虑一下,如果标准定义了这样的东西:
template <typename T>
std::string std::to_string(const T& v);
Run Code Online (Sandbox Code Playgroud)
然后我们可以在我们的程序中自由地为任何类型添加特化以符合这个签名,因此 C++ 将有一种统一的方式将类型转换为人类可读的字符串。为什么不这样做?当前设计背后的想法是什么?
编辑1:
我对当前设计的主要批评std是不允许向 to 添加重载,因此我们不能编写任何类似的东西,std:to_string(object-that-is-of-user-defined-types)并且必须退回到to_string()在自己的命名空间中定义 a并记住在哪里使用他们的版本或std版本取决于他们正在处理的类型......这对我来说听起来很头疼。
我真正喜欢 Python(或其他一些语言)的一件事是,您可以通过实现一些魔术方法使自己的类型像本机类型一样工作。我认为这个问题的根本是为什么 C++ 决定禁止人们std::to_string()为他们自己的类型实现,从而禁止我们在任何地方都遵循相同的接口。
对于诸如hashor 之类的常见事物to_string(),在语言/stdlib级别上拥有单个界面,然后期望用户遵守该界面,而不是拥有多个界面,不是更好吗?
为什么 C++ 决定禁止人们
std::to_string为自己的类型实现
这就是 ADL 有用的地方。我们已经有了如何正确使用 的示例std::swap,这已经在许多代码库中成功完成:
template <typename T>
void swap_example(T & a, T & b) {
using std::swap;
swap(a, b);
}
Run Code Online (Sandbox Code Playgroud)
如果在T中声明的命名空间具有兼容的swap()功能,而无需重载 ,则此方法有效std::swap。我们可以做同样的事情std::to_string:
template <typename T>
void to_string_example(T const & x) {
using std::to_string;
to_string(x);
}
Run Code Online (Sandbox Code Playgroud)
如果在其中T声明的命名空间具有to_string可以接受T const &参数的函数,则这同样有效。例如:
namespace example {
class Foo;
std::string to_string(Foo const &);
}
Run Code Online (Sandbox Code Playgroud)
to_string_example(example::Foo{})会找到并使用相应的example::to_string函数。
记住在哪里使用他们的版本或标准版本取决于他们正在处理的类型......这对我来说听起来很头疼。
如果这真的让您头疼,您可以将 ADL 隐藏在项目中的实用函数后面:
template <typename T>
std::string adl_to_string(T const & x) {
using std::to_string;
return to_string(x);
}
Run Code Online (Sandbox Code Playgroud)
现在你可以adl_to_string(...)在std::to_string(...)任何地方使用而不必考虑它。
| 归档时间: |
|
| 查看次数: |
226 次 |
| 最近记录: |