为自定义类型重载std :: to_string和std :: to_chars?

时间:2018-07-07 06:16:53

标签: c++ c++17 c++-standard-library

我有一个带有to_string()成员的算术自定义类型。我正在考虑在std::to_string类型的名称空间中重载std,但是这会算作名称空间污染吗?

编辑: 我正在考虑这一点,以便该表达式SFINAE适用于以下类型: -> decltype(std::to_string(std::declval<T>()), void(0))

1 个答案:

答案 0 :(得分:3)

正如Some programmer dudecomment中指出的那样,在这种情况下,您不能将声明添加到std命名空间中。

this post一样,一种解决方法是将to_string写在与自定义类相同的名称空间中,并在需要时使用using std::to_string使std::to_string处于重载状态将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
}