[英]Why is std::to_string() not templated?
如此處所述std::string
不是模板 function 而是標准選擇使用 function 重載來為不同類型提供此 function。 我的問題是,在這種情況下,當模板/專業化似乎對我更有意義時,為什么要使用重載? 考慮一下,如果標准定義了這樣的內容:
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(或其他一些語言)的一件事是,您可以通過實現一些魔術方法使自己的類型像本機類型一樣工作。 我認為這個問題的根本原因是為什么 C++ 決定禁止人們為自己的類型實現std::to_string()
,從而禁止我們在任何地方都遵循相同的接口。
對於像hash
或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);
}
如果在其中聲明的命名空間T
具有兼容的swap()
function,則此方法有效,而無需重載std::swap
。 我們可以用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
function,這同樣可以工作。 例如:
namespace example {
class Foo;
std::string to_string(Foo const &);
}
to_string_example(example::Foo{})
會找到並使用相應的example::to_string
function。
記住在哪里使用他們的版本或標准版本取決於他們正在處理的類型......這對我來說聽起來很頭疼。
如果這真的讓您頭疼,您可以在項目中將 ADL 隱藏在實用程序 function 后面:
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(...)
而不必考慮它。
這可能聽起來有點無聊,但std::to_string
的目的是像您使用過sprintf
一樣進行格式化,因為sprintf
僅支持有限的一組類型,這對於std::to_string
也是如此。 無需將其設為模板。
正如此答案中詳細解釋的那樣,設計沒有您認為的限制。 您仍然可以提供自己的foo::to_string(foo::bar&)
並且在使用適當的名稱限定來啟用 ADL 的代碼中將調用您的重載。 為此,沒有必要向std
添加重載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.