gpt4 book ai didi

c++ - 为什么 std::to_string() 没有模板化?

转载 作者:行者123 更新时间:2023-12-01 14:13:11 25 4
gpt4 key购买 nike

如上所述 here std::string 不是模板函数,而是标准选择使用函数重载为不同类型提供此函数。我的问题是,在这种情况下,当模板/特化似乎对我更有意义时,为什么要使用重载?考虑一下,如果标准定义了这样的内容:

template <typename T>
std::string std::to_string(const T& v);

然后我们可以在我们的程序中自由地为任何类型添加特殊化以符合这个签名,因此 C++ 将有一个统一的方式将类型转换为人类可读的字符串。为什么不这样做?当前设计背后的想法是什么?

编辑 1:

我对当前设计的主要批评是不允许向 std 添加重载,因此我们不能编写像 std:to_string(object-that-is-of -user-defined-types) 并且必须在他们自己的命名空间中定义一个 to_string() 并记住在哪里使用他们的版本或 std版本取决于他们正在处理的类型......这听起来让我很头疼。

我真正喜欢 Python(或其他一些语言)的一点是,您可以通过实现一些魔术方法使自己的类型像 native 类型一样工作。我认为这个问题的根本原因是为什么 C++ 决定禁止人们为自己的类型实现 std::to_string() 从而禁止我们在任何地方都遵循相同的接口(interface)。

对于像 hashto_string() 这样的常见事物,在语言/stdlib 级别上拥有单一接口(interface)不是更好吗?那么期望用户遵守那个界面,而不是拥有多个界面?

最佳答案

why C++ decided to disallow people to implement std::to_string for their own type

这就是 ADL 有用的地方。我们已经有了如何使用 std::swap 正确执行此操作的示例,这已在许多代码库中成功完成:

template <typename T>
void swap_example(T & a, T & b) {
using std::swap;
swap(a, b);
}

如果命名空间 T 被声明具有兼容的 swap() 函数,则此方法有效,无需 需要重载 std: :交换。我们可以用 std::to_string:

做同样的事情
template <typename T>
void to_string_example(T const & x) {
using std::to_string;
to_string(x);
}

如果命名空间 T 被声明有一个可以接受 T const & 参数的 to_string 函数,这同样可以工作。例如:

namespace example {
class Foo;

std::string to_string(Foo const &);
}

to_string_example(example::Foo{}) 会找到并使用相应的 example::to_string 函数。


remember where to use their version or the std version depends on the types they are dealing with... This sounds like a headache for me.

如果这真的让您头疼,您可以将 ADL 隐藏在项目中的实用程序函数后面:

template <typename T>
std::string adl_to_string(T const & x) {
using std::to_string;
return to_string(x);
}

现在您可以在任何地方使用 adl_to_string(...) 代替 std::to_string(...) 而不必考虑它。

关于c++ - 为什么 std::to_string() 没有模板化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62770643/

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