为一个自定义类型重载 std::to_string 和 std::to_chars,该怎么做?

3
我有一个带有to_string()成员的算术自定义类型。我正在考虑在std命名空间中重载std::to_string,但这会被视为命名空间污染吗?
编辑:我正在考虑这样做,以便该表达式SFINAE可以用于该类型: -> decltype(std::to_string(std::declval<T>()), void(0))

1
这个扩展std命名空间的参考文献可能会很有用。简而言之,重载例如std::to_string是不允许的(并且会导致未定义行为)。 - Some programmer dude
1
另一种选择是将 to_stringto_chars 保留在您自己的命名空间中,然后利用参数依赖查找。但这可能有些棘手。 - user2486888
能否看到您的完整提案?(有兴趣) - Paul Sanders
我会尝试使用ADL进行实验,希望它可以正常工作。 - user1095108
1个回答

3
Some programmer dude评论区中指出,您不能将声明添加到此情况下的std命名空间中。
就像这篇帖子一样,一种解决方法是在与自定义类相同的命名空间中编写您的to_string,并使用using std::to_string来在您想要使用to_string进行通用类型时将std::to_string引入重载分辨率。以下是一个示例:
#include <string>

struct A {};

std::string to_string(A) {return "";}

namespace detail { // does not expose "using std::to_string"
    using std::to_string;
    template <typename T>
    decltype(to_string(std::declval<T>()), void(0)) foo() {}
}
using detail::foo;

int main()
{
    foo<int>();      // ok
    foo<A>();        // ok
    // to_string(0); // error, std::to_string is not exposed
}

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